Home | History | Annotate | Line # | Download | only in AST
      1 //===- Decl.h - Classes for representing declarations -----------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 //  This file defines the Decl subclasses.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_CLANG_AST_DECL_H
     14 #define LLVM_CLANG_AST_DECL_H
     15 
     16 #include "clang/AST/APValue.h"
     17 #include "clang/AST/ASTContextAllocate.h"
     18 #include "clang/AST/DeclAccessPair.h"
     19 #include "clang/AST/DeclBase.h"
     20 #include "clang/AST/DeclarationName.h"
     21 #include "clang/AST/ExternalASTSource.h"
     22 #include "clang/AST/NestedNameSpecifier.h"
     23 #include "clang/AST/Redeclarable.h"
     24 #include "clang/AST/Type.h"
     25 #include "clang/Basic/AddressSpaces.h"
     26 #include "clang/Basic/Diagnostic.h"
     27 #include "clang/Basic/IdentifierTable.h"
     28 #include "clang/Basic/LLVM.h"
     29 #include "clang/Basic/Linkage.h"
     30 #include "clang/Basic/OperatorKinds.h"
     31 #include "clang/Basic/PartialDiagnostic.h"
     32 #include "clang/Basic/PragmaKinds.h"
     33 #include "clang/Basic/SourceLocation.h"
     34 #include "clang/Basic/Specifiers.h"
     35 #include "clang/Basic/Visibility.h"
     36 #include "llvm/ADT/APSInt.h"
     37 #include "llvm/ADT/ArrayRef.h"
     38 #include "llvm/ADT/Optional.h"
     39 #include "llvm/ADT/PointerIntPair.h"
     40 #include "llvm/ADT/PointerUnion.h"
     41 #include "llvm/ADT/StringRef.h"
     42 #include "llvm/ADT/iterator_range.h"
     43 #include "llvm/Support/Casting.h"
     44 #include "llvm/Support/Compiler.h"
     45 #include "llvm/Support/TrailingObjects.h"
     46 #include <cassert>
     47 #include <cstddef>
     48 #include <cstdint>
     49 #include <string>
     50 #include <utility>
     51 
     52 namespace clang {
     53 
     54 class ASTContext;
     55 struct ASTTemplateArgumentListInfo;
     56 class Attr;
     57 class CompoundStmt;
     58 class DependentFunctionTemplateSpecializationInfo;
     59 class EnumDecl;
     60 class Expr;
     61 class FunctionTemplateDecl;
     62 class FunctionTemplateSpecializationInfo;
     63 class FunctionTypeLoc;
     64 class LabelStmt;
     65 class MemberSpecializationInfo;
     66 class Module;
     67 class NamespaceDecl;
     68 class ParmVarDecl;
     69 class RecordDecl;
     70 class Stmt;
     71 class StringLiteral;
     72 class TagDecl;
     73 class TemplateArgumentList;
     74 class TemplateArgumentListInfo;
     75 class TemplateParameterList;
     76 class TypeAliasTemplateDecl;
     77 class TypeLoc;
     78 class UnresolvedSetImpl;
     79 class VarTemplateDecl;
     80 
     81 /// The top declaration context.
     82 class TranslationUnitDecl : public Decl, public DeclContext {
     83   ASTContext &Ctx;
     84 
     85   /// The (most recently entered) anonymous namespace for this
     86   /// translation unit, if one has been created.
     87   NamespaceDecl *AnonymousNamespace = nullptr;
     88 
     89   explicit TranslationUnitDecl(ASTContext &ctx);
     90 
     91   virtual void anchor();
     92 
     93 public:
     94   ASTContext &getASTContext() const { return Ctx; }
     95 
     96   NamespaceDecl *getAnonymousNamespace() const { return AnonymousNamespace; }
     97   void setAnonymousNamespace(NamespaceDecl *D) { AnonymousNamespace = D; }
     98 
     99   static TranslationUnitDecl *Create(ASTContext &C);
    100 
    101   // Implement isa/cast/dyncast/etc.
    102   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    103   static bool classofKind(Kind K) { return K == TranslationUnit; }
    104   static DeclContext *castToDeclContext(const TranslationUnitDecl *D) {
    105     return static_cast<DeclContext *>(const_cast<TranslationUnitDecl*>(D));
    106   }
    107   static TranslationUnitDecl *castFromDeclContext(const DeclContext *DC) {
    108     return static_cast<TranslationUnitDecl *>(const_cast<DeclContext*>(DC));
    109   }
    110 };
    111 
    112 /// Represents a `#pragma comment` line. Always a child of
    113 /// TranslationUnitDecl.
    114 class PragmaCommentDecl final
    115     : public Decl,
    116       private llvm::TrailingObjects<PragmaCommentDecl, char> {
    117   friend class ASTDeclReader;
    118   friend class ASTDeclWriter;
    119   friend TrailingObjects;
    120 
    121   PragmaMSCommentKind CommentKind;
    122 
    123   PragmaCommentDecl(TranslationUnitDecl *TU, SourceLocation CommentLoc,
    124                     PragmaMSCommentKind CommentKind)
    125       : Decl(PragmaComment, TU, CommentLoc), CommentKind(CommentKind) {}
    126 
    127   virtual void anchor();
    128 
    129 public:
    130   static PragmaCommentDecl *Create(const ASTContext &C, TranslationUnitDecl *DC,
    131                                    SourceLocation CommentLoc,
    132                                    PragmaMSCommentKind CommentKind,
    133                                    StringRef Arg);
    134   static PragmaCommentDecl *CreateDeserialized(ASTContext &C, unsigned ID,
    135                                                unsigned ArgSize);
    136 
    137   PragmaMSCommentKind getCommentKind() const { return CommentKind; }
    138 
    139   StringRef getArg() const { return getTrailingObjects<char>(); }
    140 
    141   // Implement isa/cast/dyncast/etc.
    142   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    143   static bool classofKind(Kind K) { return K == PragmaComment; }
    144 };
    145 
    146 /// Represents a `#pragma detect_mismatch` line. Always a child of
    147 /// TranslationUnitDecl.
    148 class PragmaDetectMismatchDecl final
    149     : public Decl,
    150       private llvm::TrailingObjects<PragmaDetectMismatchDecl, char> {
    151   friend class ASTDeclReader;
    152   friend class ASTDeclWriter;
    153   friend TrailingObjects;
    154 
    155   size_t ValueStart;
    156 
    157   PragmaDetectMismatchDecl(TranslationUnitDecl *TU, SourceLocation Loc,
    158                            size_t ValueStart)
    159       : Decl(PragmaDetectMismatch, TU, Loc), ValueStart(ValueStart) {}
    160 
    161   virtual void anchor();
    162 
    163 public:
    164   static PragmaDetectMismatchDecl *Create(const ASTContext &C,
    165                                           TranslationUnitDecl *DC,
    166                                           SourceLocation Loc, StringRef Name,
    167                                           StringRef Value);
    168   static PragmaDetectMismatchDecl *
    169   CreateDeserialized(ASTContext &C, unsigned ID, unsigned NameValueSize);
    170 
    171   StringRef getName() const { return getTrailingObjects<char>(); }
    172   StringRef getValue() const { return getTrailingObjects<char>() + ValueStart; }
    173 
    174   // Implement isa/cast/dyncast/etc.
    175   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    176   static bool classofKind(Kind K) { return K == PragmaDetectMismatch; }
    177 };
    178 
    179 /// Declaration context for names declared as extern "C" in C++. This
    180 /// is neither the semantic nor lexical context for such declarations, but is
    181 /// used to check for conflicts with other extern "C" declarations. Example:
    182 ///
    183 /// \code
    184 ///   namespace N { extern "C" void f(); } // #1
    185 ///   void N::f() {}                       // #2
    186 ///   namespace M { extern "C" void f(); } // #3
    187 /// \endcode
    188 ///
    189 /// The semantic context of #1 is namespace N and its lexical context is the
    190 /// LinkageSpecDecl; the semantic context of #2 is namespace N and its lexical
    191 /// context is the TU. However, both declarations are also visible in the
    192 /// extern "C" context.
    193 ///
    194 /// The declaration at #3 finds it is a redeclaration of \c N::f through
    195 /// lookup in the extern "C" context.
    196 class ExternCContextDecl : public Decl, public DeclContext {
    197   explicit ExternCContextDecl(TranslationUnitDecl *TU)
    198     : Decl(ExternCContext, TU, SourceLocation()),
    199       DeclContext(ExternCContext) {}
    200 
    201   virtual void anchor();
    202 
    203 public:
    204   static ExternCContextDecl *Create(const ASTContext &C,
    205                                     TranslationUnitDecl *TU);
    206 
    207   // Implement isa/cast/dyncast/etc.
    208   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    209   static bool classofKind(Kind K) { return K == ExternCContext; }
    210   static DeclContext *castToDeclContext(const ExternCContextDecl *D) {
    211     return static_cast<DeclContext *>(const_cast<ExternCContextDecl*>(D));
    212   }
    213   static ExternCContextDecl *castFromDeclContext(const DeclContext *DC) {
    214     return static_cast<ExternCContextDecl *>(const_cast<DeclContext*>(DC));
    215   }
    216 };
    217 
    218 /// This represents a decl that may have a name.  Many decls have names such
    219 /// as ObjCMethodDecl, but not \@class, etc.
    220 ///
    221 /// Note that not every NamedDecl is actually named (e.g., a struct might
    222 /// be anonymous), and not every name is an identifier.
    223 class NamedDecl : public Decl {
    224   /// The name of this declaration, which is typically a normal
    225   /// identifier but may also be a special kind of name (C++
    226   /// constructor, Objective-C selector, etc.)
    227   DeclarationName Name;
    228 
    229   virtual void anchor();
    230 
    231 private:
    232   NamedDecl *getUnderlyingDeclImpl() LLVM_READONLY;
    233 
    234 protected:
    235   NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
    236       : Decl(DK, DC, L), Name(N) {}
    237 
    238 public:
    239   /// Get the identifier that names this declaration, if there is one.
    240   ///
    241   /// This will return NULL if this declaration has no name (e.g., for
    242   /// an unnamed class) or if the name is a special name (C++ constructor,
    243   /// Objective-C selector, etc.).
    244   IdentifierInfo *getIdentifier() const { return Name.getAsIdentifierInfo(); }
    245 
    246   /// Get the name of identifier for this declaration as a StringRef.
    247   ///
    248   /// This requires that the declaration have a name and that it be a simple
    249   /// identifier.
    250   StringRef getName() const {
    251     assert(Name.isIdentifier() && "Name is not a simple identifier");
    252     return getIdentifier() ? getIdentifier()->getName() : "";
    253   }
    254 
    255   /// Get a human-readable name for the declaration, even if it is one of the
    256   /// special kinds of names (C++ constructor, Objective-C selector, etc).
    257   ///
    258   /// Creating this name requires expensive string manipulation, so it should
    259   /// be called only when performance doesn't matter. For simple declarations,
    260   /// getNameAsCString() should suffice.
    261   //
    262   // FIXME: This function should be renamed to indicate that it is not just an
    263   // alternate form of getName(), and clients should move as appropriate.
    264   //
    265   // FIXME: Deprecated, move clients to getName().
    266   std::string getNameAsString() const { return Name.getAsString(); }
    267 
    268   /// Pretty-print the unqualified name of this declaration. Can be overloaded
    269   /// by derived classes to provide a more user-friendly name when appropriate.
    270   virtual void printName(raw_ostream &os) const;
    271 
    272   /// Get the actual, stored name of the declaration, which may be a special
    273   /// name.
    274   ///
    275   /// Note that generally in diagnostics, the non-null \p NamedDecl* itself
    276   /// should be sent into the diagnostic instead of using the result of
    277   /// \p getDeclName().
    278   ///
    279   /// A \p DeclarationName in a diagnostic will just be streamed to the output,
    280   /// which will directly result in a call to \p DeclarationName::print.
    281   ///
    282   /// A \p NamedDecl* in a diagnostic will also ultimately result in a call to
    283   /// \p DeclarationName::print, but with two customisation points along the
    284   /// way (\p getNameForDiagnostic and \p printName). These are used to print
    285   /// the template arguments if any, and to provide a user-friendly name for
    286   /// some entities (such as unnamed variables and anonymous records).
    287   DeclarationName getDeclName() const { return Name; }
    288 
    289   /// Set the name of this declaration.
    290   void setDeclName(DeclarationName N) { Name = N; }
    291 
    292   /// Returns a human-readable qualified name for this declaration, like
    293   /// A::B::i, for i being member of namespace A::B.
    294   ///
    295   /// If the declaration is not a member of context which can be named (record,
    296   /// namespace), it will return the same result as printName().
    297   ///
    298   /// Creating this name is expensive, so it should be called only when
    299   /// performance doesn't matter.
    300   void printQualifiedName(raw_ostream &OS) const;
    301   void printQualifiedName(raw_ostream &OS, const PrintingPolicy &Policy) const;
    302 
    303   /// Print only the nested name specifier part of a fully-qualified name,
    304   /// including the '::' at the end. E.g.
    305   ///    when `printQualifiedName(D)` prints "A::B::i",
    306   ///    this function prints "A::B::".
    307   void printNestedNameSpecifier(raw_ostream &OS) const;
    308   void printNestedNameSpecifier(raw_ostream &OS,
    309                                 const PrintingPolicy &Policy) const;
    310 
    311   // FIXME: Remove string version.
    312   std::string getQualifiedNameAsString() const;
    313 
    314   /// Appends a human-readable name for this declaration into the given stream.
    315   ///
    316   /// This is the method invoked by Sema when displaying a NamedDecl
    317   /// in a diagnostic.  It does not necessarily produce the same
    318   /// result as printName(); for example, class template
    319   /// specializations are printed with their template arguments.
    320   virtual void getNameForDiagnostic(raw_ostream &OS,
    321                                     const PrintingPolicy &Policy,
    322                                     bool Qualified) const;
    323 
    324   /// Determine whether this declaration, if known to be well-formed within
    325   /// its context, will replace the declaration OldD if introduced into scope.
    326   ///
    327   /// A declaration will replace another declaration if, for example, it is
    328   /// a redeclaration of the same variable or function, but not if it is a
    329   /// declaration of a different kind (function vs. class) or an overloaded
    330   /// function.
    331   ///
    332   /// \param IsKnownNewer \c true if this declaration is known to be newer
    333   /// than \p OldD (for instance, if this declaration is newly-created).
    334   bool declarationReplaces(NamedDecl *OldD, bool IsKnownNewer = true) const;
    335 
    336   /// Determine whether this declaration has linkage.
    337   bool hasLinkage() const;
    338 
    339   using Decl::isModulePrivate;
    340   using Decl::setModulePrivate;
    341 
    342   /// Determine whether this declaration is a C++ class member.
    343   bool isCXXClassMember() const {
    344     const DeclContext *DC = getDeclContext();
    345 
    346     // C++0x [class.mem]p1:
    347     //   The enumerators of an unscoped enumeration defined in
    348     //   the class are members of the class.
    349     if (isa<EnumDecl>(DC))
    350       DC = DC->getRedeclContext();
    351 
    352     return DC->isRecord();
    353   }
    354 
    355   /// Determine whether the given declaration is an instance member of
    356   /// a C++ class.
    357   bool isCXXInstanceMember() const;
    358 
    359   /// Determine if the declaration obeys the reserved identifier rules of the
    360   /// given language.
    361   ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const;
    362 
    363   /// Determine what kind of linkage this entity has.
    364   ///
    365   /// This is not the linkage as defined by the standard or the codegen notion
    366   /// of linkage. It is just an implementation detail that is used to compute
    367   /// those.
    368   Linkage getLinkageInternal() const;
    369 
    370   /// Get the linkage from a semantic point of view. Entities in
    371   /// anonymous namespaces are external (in c++98).
    372   Linkage getFormalLinkage() const {
    373     return clang::getFormalLinkage(getLinkageInternal());
    374   }
    375 
    376   /// True if this decl has external linkage.
    377   bool hasExternalFormalLinkage() const {
    378     return isExternalFormalLinkage(getLinkageInternal());
    379   }
    380 
    381   bool isExternallyVisible() const {
    382     return clang::isExternallyVisible(getLinkageInternal());
    383   }
    384 
    385   /// Determine whether this declaration can be redeclared in a
    386   /// different translation unit.
    387   bool isExternallyDeclarable() const {
    388     return isExternallyVisible() && !getOwningModuleForLinkage();
    389   }
    390 
    391   /// Determines the visibility of this entity.
    392   Visibility getVisibility() const {
    393     return getLinkageAndVisibility().getVisibility();
    394   }
    395 
    396   /// Determines the linkage and visibility of this entity.
    397   LinkageInfo getLinkageAndVisibility() const;
    398 
    399   /// Kinds of explicit visibility.
    400   enum ExplicitVisibilityKind {
    401     /// Do an LV computation for, ultimately, a type.
    402     /// Visibility may be restricted by type visibility settings and
    403     /// the visibility of template arguments.
    404     VisibilityForType,
    405 
    406     /// Do an LV computation for, ultimately, a non-type declaration.
    407     /// Visibility may be restricted by value visibility settings and
    408     /// the visibility of template arguments.
    409     VisibilityForValue
    410   };
    411 
    412   /// If visibility was explicitly specified for this
    413   /// declaration, return that visibility.
    414   Optional<Visibility>
    415   getExplicitVisibility(ExplicitVisibilityKind kind) const;
    416 
    417   /// True if the computed linkage is valid. Used for consistency
    418   /// checking. Should always return true.
    419   bool isLinkageValid() const;
    420 
    421   /// True if something has required us to compute the linkage
    422   /// of this declaration.
    423   ///
    424   /// Language features which can retroactively change linkage (like a
    425   /// typedef name for linkage purposes) may need to consider this,
    426   /// but hopefully only in transitory ways during parsing.
    427   bool hasLinkageBeenComputed() const {
    428     return hasCachedLinkage();
    429   }
    430 
    431   /// Looks through UsingDecls and ObjCCompatibleAliasDecls for
    432   /// the underlying named decl.
    433   NamedDecl *getUnderlyingDecl() {
    434     // Fast-path the common case.
    435     if (this->getKind() != UsingShadow &&
    436         this->getKind() != ConstructorUsingShadow &&
    437         this->getKind() != ObjCCompatibleAlias &&
    438         this->getKind() != NamespaceAlias)
    439       return this;
    440 
    441     return getUnderlyingDeclImpl();
    442   }
    443   const NamedDecl *getUnderlyingDecl() const {
    444     return const_cast<NamedDecl*>(this)->getUnderlyingDecl();
    445   }
    446 
    447   NamedDecl *getMostRecentDecl() {
    448     return cast<NamedDecl>(static_cast<Decl *>(this)->getMostRecentDecl());
    449   }
    450   const NamedDecl *getMostRecentDecl() const {
    451     return const_cast<NamedDecl*>(this)->getMostRecentDecl();
    452   }
    453 
    454   ObjCStringFormatFamily getObjCFStringFormattingFamily() const;
    455 
    456   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    457   static bool classofKind(Kind K) { return K >= firstNamed && K <= lastNamed; }
    458 };
    459 
    460 inline raw_ostream &operator<<(raw_ostream &OS, const NamedDecl &ND) {
    461   ND.printName(OS);
    462   return OS;
    463 }
    464 
    465 /// Represents the declaration of a label.  Labels also have a
    466 /// corresponding LabelStmt, which indicates the position that the label was
    467 /// defined at.  For normal labels, the location of the decl is the same as the
    468 /// location of the statement.  For GNU local labels (__label__), the decl
    469 /// location is where the __label__ is.
    470 class LabelDecl : public NamedDecl {
    471   LabelStmt *TheStmt;
    472   StringRef MSAsmName;
    473   bool MSAsmNameResolved = false;
    474 
    475   /// For normal labels, this is the same as the main declaration
    476   /// label, i.e., the location of the identifier; for GNU local labels,
    477   /// this is the location of the __label__ keyword.
    478   SourceLocation LocStart;
    479 
    480   LabelDecl(DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II,
    481             LabelStmt *S, SourceLocation StartL)
    482       : NamedDecl(Label, DC, IdentL, II), TheStmt(S), LocStart(StartL) {}
    483 
    484   void anchor() override;
    485 
    486 public:
    487   static LabelDecl *Create(ASTContext &C, DeclContext *DC,
    488                            SourceLocation IdentL, IdentifierInfo *II);
    489   static LabelDecl *Create(ASTContext &C, DeclContext *DC,
    490                            SourceLocation IdentL, IdentifierInfo *II,
    491                            SourceLocation GnuLabelL);
    492   static LabelDecl *CreateDeserialized(ASTContext &C, unsigned ID);
    493 
    494   LabelStmt *getStmt() const { return TheStmt; }
    495   void setStmt(LabelStmt *T) { TheStmt = T; }
    496 
    497   bool isGnuLocal() const { return LocStart != getLocation(); }
    498   void setLocStart(SourceLocation L) { LocStart = L; }
    499 
    500   SourceRange getSourceRange() const override LLVM_READONLY {
    501     return SourceRange(LocStart, getLocation());
    502   }
    503 
    504   bool isMSAsmLabel() const { return !MSAsmName.empty(); }
    505   bool isResolvedMSAsmLabel() const { return isMSAsmLabel() && MSAsmNameResolved; }
    506   void setMSAsmLabel(StringRef Name);
    507   StringRef getMSAsmLabel() const { return MSAsmName; }
    508   void setMSAsmLabelResolved() { MSAsmNameResolved = true; }
    509 
    510   // Implement isa/cast/dyncast/etc.
    511   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    512   static bool classofKind(Kind K) { return K == Label; }
    513 };
    514 
    515 /// Represent a C++ namespace.
    516 class NamespaceDecl : public NamedDecl, public DeclContext,
    517                       public Redeclarable<NamespaceDecl>
    518 {
    519   /// The starting location of the source range, pointing
    520   /// to either the namespace or the inline keyword.
    521   SourceLocation LocStart;
    522 
    523   /// The ending location of the source range.
    524   SourceLocation RBraceLoc;
    525 
    526   /// A pointer to either the anonymous namespace that lives just inside
    527   /// this namespace or to the first namespace in the chain (the latter case
    528   /// only when this is not the first in the chain), along with a
    529   /// boolean value indicating whether this is an inline namespace.
    530   llvm::PointerIntPair<NamespaceDecl *, 1, bool> AnonOrFirstNamespaceAndInline;
    531 
    532   NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
    533                 SourceLocation StartLoc, SourceLocation IdLoc,
    534                 IdentifierInfo *Id, NamespaceDecl *PrevDecl);
    535 
    536   using redeclarable_base = Redeclarable<NamespaceDecl>;
    537 
    538   NamespaceDecl *getNextRedeclarationImpl() override;
    539   NamespaceDecl *getPreviousDeclImpl() override;
    540   NamespaceDecl *getMostRecentDeclImpl() override;
    541 
    542 public:
    543   friend class ASTDeclReader;
    544   friend class ASTDeclWriter;
    545 
    546   static NamespaceDecl *Create(ASTContext &C, DeclContext *DC,
    547                                bool Inline, SourceLocation StartLoc,
    548                                SourceLocation IdLoc, IdentifierInfo *Id,
    549                                NamespaceDecl *PrevDecl);
    550 
    551   static NamespaceDecl *CreateDeserialized(ASTContext &C, unsigned ID);
    552 
    553   using redecl_range = redeclarable_base::redecl_range;
    554   using redecl_iterator = redeclarable_base::redecl_iterator;
    555 
    556   using redeclarable_base::redecls_begin;
    557   using redeclarable_base::redecls_end;
    558   using redeclarable_base::redecls;
    559   using redeclarable_base::getPreviousDecl;
    560   using redeclarable_base::getMostRecentDecl;
    561   using redeclarable_base::isFirstDecl;
    562 
    563   /// Returns true if this is an anonymous namespace declaration.
    564   ///
    565   /// For example:
    566   /// \code
    567   ///   namespace {
    568   ///     ...
    569   ///   };
    570   /// \endcode
    571   /// q.v. C++ [namespace.unnamed]
    572   bool isAnonymousNamespace() const {
    573     return !getIdentifier();
    574   }
    575 
    576   /// Returns true if this is an inline namespace declaration.
    577   bool isInline() const {
    578     return AnonOrFirstNamespaceAndInline.getInt();
    579   }
    580 
    581   /// Set whether this is an inline namespace declaration.
    582   void setInline(bool Inline) {
    583     AnonOrFirstNamespaceAndInline.setInt(Inline);
    584   }
    585 
    586   /// Returns true if the inline qualifier for \c Name is redundant.
    587   bool isRedundantInlineQualifierFor(DeclarationName Name) const {
    588     if (!isInline())
    589       return false;
    590     auto X = lookup(Name);
    591     auto Y = getParent()->lookup(Name);
    592     return std::distance(X.begin(), X.end()) ==
    593       std::distance(Y.begin(), Y.end());
    594   }
    595 
    596   /// Get the original (first) namespace declaration.
    597   NamespaceDecl *getOriginalNamespace();
    598 
    599   /// Get the original (first) namespace declaration.
    600   const NamespaceDecl *getOriginalNamespace() const;
    601 
    602   /// Return true if this declaration is an original (first) declaration
    603   /// of the namespace. This is false for non-original (subsequent) namespace
    604   /// declarations and anonymous namespaces.
    605   bool isOriginalNamespace() const;
    606 
    607   /// Retrieve the anonymous namespace nested inside this namespace,
    608   /// if any.
    609   NamespaceDecl *getAnonymousNamespace() const {
    610     return getOriginalNamespace()->AnonOrFirstNamespaceAndInline.getPointer();
    611   }
    612 
    613   void setAnonymousNamespace(NamespaceDecl *D) {
    614     getOriginalNamespace()->AnonOrFirstNamespaceAndInline.setPointer(D);
    615   }
    616 
    617   /// Retrieves the canonical declaration of this namespace.
    618   NamespaceDecl *getCanonicalDecl() override {
    619     return getOriginalNamespace();
    620   }
    621   const NamespaceDecl *getCanonicalDecl() const {
    622     return getOriginalNamespace();
    623   }
    624 
    625   SourceRange getSourceRange() const override LLVM_READONLY {
    626     return SourceRange(LocStart, RBraceLoc);
    627   }
    628 
    629   SourceLocation getBeginLoc() const LLVM_READONLY { return LocStart; }
    630   SourceLocation getRBraceLoc() const { return RBraceLoc; }
    631   void setLocStart(SourceLocation L) { LocStart = L; }
    632   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
    633 
    634   // Implement isa/cast/dyncast/etc.
    635   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    636   static bool classofKind(Kind K) { return K == Namespace; }
    637   static DeclContext *castToDeclContext(const NamespaceDecl *D) {
    638     return static_cast<DeclContext *>(const_cast<NamespaceDecl*>(D));
    639   }
    640   static NamespaceDecl *castFromDeclContext(const DeclContext *DC) {
    641     return static_cast<NamespaceDecl *>(const_cast<DeclContext*>(DC));
    642   }
    643 };
    644 
    645 /// Represent the declaration of a variable (in which case it is
    646 /// an lvalue) a function (in which case it is a function designator) or
    647 /// an enum constant.
    648 class ValueDecl : public NamedDecl {
    649   QualType DeclType;
    650 
    651   void anchor() override;
    652 
    653 protected:
    654   ValueDecl(Kind DK, DeclContext *DC, SourceLocation L,
    655             DeclarationName N, QualType T)
    656     : NamedDecl(DK, DC, L, N), DeclType(T) {}
    657 
    658 public:
    659   QualType getType() const { return DeclType; }
    660   void setType(QualType newType) { DeclType = newType; }
    661 
    662   /// Determine whether this symbol is weakly-imported,
    663   ///        or declared with the weak or weak-ref attr.
    664   bool isWeak() const;
    665 
    666   // Implement isa/cast/dyncast/etc.
    667   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    668   static bool classofKind(Kind K) { return K >= firstValue && K <= lastValue; }
    669 };
    670 
    671 /// A struct with extended info about a syntactic
    672 /// name qualifier, to be used for the case of out-of-line declarations.
    673 struct QualifierInfo {
    674   NestedNameSpecifierLoc QualifierLoc;
    675 
    676   /// The number of "outer" template parameter lists.
    677   /// The count includes all of the template parameter lists that were matched
    678   /// against the template-ids occurring into the NNS and possibly (in the
    679   /// case of an explicit specialization) a final "template <>".
    680   unsigned NumTemplParamLists = 0;
    681 
    682   /// A new-allocated array of size NumTemplParamLists,
    683   /// containing pointers to the "outer" template parameter lists.
    684   /// It includes all of the template parameter lists that were matched
    685   /// against the template-ids occurring into the NNS and possibly (in the
    686   /// case of an explicit specialization) a final "template <>".
    687   TemplateParameterList** TemplParamLists = nullptr;
    688 
    689   QualifierInfo() = default;
    690   QualifierInfo(const QualifierInfo &) = delete;
    691   QualifierInfo& operator=(const QualifierInfo &) = delete;
    692 
    693   /// Sets info about "outer" template parameter lists.
    694   void setTemplateParameterListsInfo(ASTContext &Context,
    695                                      ArrayRef<TemplateParameterList *> TPLists);
    696 };
    697 
    698 /// Represents a ValueDecl that came out of a declarator.
    699 /// Contains type source information through TypeSourceInfo.
    700 class DeclaratorDecl : public ValueDecl {
    701   // A struct representing a TInfo, a trailing requires-clause and a syntactic
    702   // qualifier, to be used for the (uncommon) case of out-of-line declarations
    703   // and constrained function decls.
    704   struct ExtInfo : public QualifierInfo {
    705     TypeSourceInfo *TInfo;
    706     Expr *TrailingRequiresClause = nullptr;
    707   };
    708 
    709   llvm::PointerUnion<TypeSourceInfo *, ExtInfo *> DeclInfo;
    710 
    711   /// The start of the source range for this declaration,
    712   /// ignoring outer template declarations.
    713   SourceLocation InnerLocStart;
    714 
    715   bool hasExtInfo() const { return DeclInfo.is<ExtInfo*>(); }
    716   ExtInfo *getExtInfo() { return DeclInfo.get<ExtInfo*>(); }
    717   const ExtInfo *getExtInfo() const { return DeclInfo.get<ExtInfo*>(); }
    718 
    719 protected:
    720   DeclaratorDecl(Kind DK, DeclContext *DC, SourceLocation L,
    721                  DeclarationName N, QualType T, TypeSourceInfo *TInfo,
    722                  SourceLocation StartL)
    723       : ValueDecl(DK, DC, L, N, T), DeclInfo(TInfo), InnerLocStart(StartL) {}
    724 
    725 public:
    726   friend class ASTDeclReader;
    727   friend class ASTDeclWriter;
    728 
    729   TypeSourceInfo *getTypeSourceInfo() const {
    730     return hasExtInfo()
    731       ? getExtInfo()->TInfo
    732       : DeclInfo.get<TypeSourceInfo*>();
    733   }
    734 
    735   void setTypeSourceInfo(TypeSourceInfo *TI) {
    736     if (hasExtInfo())
    737       getExtInfo()->TInfo = TI;
    738     else
    739       DeclInfo = TI;
    740   }
    741 
    742   /// Return start of source range ignoring outer template declarations.
    743   SourceLocation getInnerLocStart() const { return InnerLocStart; }
    744   void setInnerLocStart(SourceLocation L) { InnerLocStart = L; }
    745 
    746   /// Return start of source range taking into account any outer template
    747   /// declarations.
    748   SourceLocation getOuterLocStart() const;
    749 
    750   SourceRange getSourceRange() const override LLVM_READONLY;
    751 
    752   SourceLocation getBeginLoc() const LLVM_READONLY {
    753     return getOuterLocStart();
    754   }
    755 
    756   /// Retrieve the nested-name-specifier that qualifies the name of this
    757   /// declaration, if it was present in the source.
    758   NestedNameSpecifier *getQualifier() const {
    759     return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
    760                         : nullptr;
    761   }
    762 
    763   /// Retrieve the nested-name-specifier (with source-location
    764   /// information) that qualifies the name of this declaration, if it was
    765   /// present in the source.
    766   NestedNameSpecifierLoc getQualifierLoc() const {
    767     return hasExtInfo() ? getExtInfo()->QualifierLoc
    768                         : NestedNameSpecifierLoc();
    769   }
    770 
    771   void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc);
    772 
    773   /// \brief Get the constraint-expression introduced by the trailing
    774   /// requires-clause in the function/member declaration, or null if no
    775   /// requires-clause was provided.
    776   Expr *getTrailingRequiresClause() {
    777     return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
    778                         : nullptr;
    779   }
    780 
    781   const Expr *getTrailingRequiresClause() const {
    782     return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
    783                         : nullptr;
    784   }
    785 
    786   void setTrailingRequiresClause(Expr *TrailingRequiresClause);
    787 
    788   unsigned getNumTemplateParameterLists() const {
    789     return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
    790   }
    791 
    792   TemplateParameterList *getTemplateParameterList(unsigned index) const {
    793     assert(index < getNumTemplateParameterLists());
    794     return getExtInfo()->TemplParamLists[index];
    795   }
    796 
    797   void setTemplateParameterListsInfo(ASTContext &Context,
    798                                      ArrayRef<TemplateParameterList *> TPLists);
    799 
    800   SourceLocation getTypeSpecStartLoc() const;
    801   SourceLocation getTypeSpecEndLoc() const;
    802 
    803   // Implement isa/cast/dyncast/etc.
    804   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    805   static bool classofKind(Kind K) {
    806     return K >= firstDeclarator && K <= lastDeclarator;
    807   }
    808 };
    809 
    810 /// Structure used to store a statement, the constant value to
    811 /// which it was evaluated (if any), and whether or not the statement
    812 /// is an integral constant expression (if known).
    813 struct EvaluatedStmt {
    814   /// Whether this statement was already evaluated.
    815   bool WasEvaluated : 1;
    816 
    817   /// Whether this statement is being evaluated.
    818   bool IsEvaluating : 1;
    819 
    820   /// Whether this variable is known to have constant initialization. This is
    821   /// currently only computed in C++, for static / thread storage duration
    822   /// variables that might have constant initialization and for variables that
    823   /// are usable in constant expressions.
    824   bool HasConstantInitialization : 1;
    825 
    826   /// Whether this variable is known to have constant destruction. That is,
    827   /// whether running the destructor on the initial value is a side-effect
    828   /// (and doesn't inspect any state that might have changed during program
    829   /// execution). This is currently only computed if the destructor is
    830   /// non-trivial.
    831   bool HasConstantDestruction : 1;
    832 
    833   /// In C++98, whether the initializer is an ICE. This affects whether the
    834   /// variable is usable in constant expressions.
    835   bool HasICEInit : 1;
    836   bool CheckedForICEInit : 1;
    837 
    838   Stmt *Value;
    839   APValue Evaluated;
    840 
    841   EvaluatedStmt()
    842       : WasEvaluated(false), IsEvaluating(false),
    843         HasConstantInitialization(false), HasConstantDestruction(false),
    844         HasICEInit(false), CheckedForICEInit(false) {}
    845 };
    846 
    847 /// Represents a variable declaration or definition.
    848 class VarDecl : public DeclaratorDecl, public Redeclarable<VarDecl> {
    849 public:
    850   /// Initialization styles.
    851   enum InitializationStyle {
    852     /// C-style initialization with assignment
    853     CInit,
    854 
    855     /// Call-style initialization (C++98)
    856     CallInit,
    857 
    858     /// Direct list-initialization (C++11)
    859     ListInit
    860   };
    861 
    862   /// Kinds of thread-local storage.
    863   enum TLSKind {
    864     /// Not a TLS variable.
    865     TLS_None,
    866 
    867     /// TLS with a known-constant initializer.
    868     TLS_Static,
    869 
    870     /// TLS with a dynamic initializer.
    871     TLS_Dynamic
    872   };
    873 
    874   /// Return the string used to specify the storage class \p SC.
    875   ///
    876   /// It is illegal to call this function with SC == None.
    877   static const char *getStorageClassSpecifierString(StorageClass SC);
    878 
    879 protected:
    880   // A pointer union of Stmt * and EvaluatedStmt *. When an EvaluatedStmt, we
    881   // have allocated the auxiliary struct of information there.
    882   //
    883   // TODO: It is a bit unfortunate to use a PointerUnion inside the VarDecl for
    884   // this as *many* VarDecls are ParmVarDecls that don't have default
    885   // arguments. We could save some space by moving this pointer union to be
    886   // allocated in trailing space when necessary.
    887   using InitType = llvm::PointerUnion<Stmt *, EvaluatedStmt *>;
    888 
    889   /// The initializer for this variable or, for a ParmVarDecl, the
    890   /// C++ default argument.
    891   mutable InitType Init;
    892 
    893 private:
    894   friend class ASTDeclReader;
    895   friend class ASTNodeImporter;
    896   friend class StmtIteratorBase;
    897 
    898   class VarDeclBitfields {
    899     friend class ASTDeclReader;
    900     friend class VarDecl;
    901 
    902     unsigned SClass : 3;
    903     unsigned TSCSpec : 2;
    904     unsigned InitStyle : 2;
    905 
    906     /// Whether this variable is an ARC pseudo-__strong variable; see
    907     /// isARCPseudoStrong() for details.
    908     unsigned ARCPseudoStrong : 1;
    909   };
    910   enum { NumVarDeclBits = 8 };
    911 
    912 protected:
    913   enum { NumParameterIndexBits = 8 };
    914 
    915   enum DefaultArgKind {
    916     DAK_None,
    917     DAK_Unparsed,
    918     DAK_Uninstantiated,
    919     DAK_Normal
    920   };
    921 
    922   enum { NumScopeDepthOrObjCQualsBits = 7 };
    923 
    924   class ParmVarDeclBitfields {
    925     friend class ASTDeclReader;
    926     friend class ParmVarDecl;
    927 
    928     unsigned : NumVarDeclBits;
    929 
    930     /// Whether this parameter inherits a default argument from a
    931     /// prior declaration.
    932     unsigned HasInheritedDefaultArg : 1;
    933 
    934     /// Describes the kind of default argument for this parameter. By default
    935     /// this is none. If this is normal, then the default argument is stored in
    936     /// the \c VarDecl initializer expression unless we were unable to parse
    937     /// (even an invalid) expression for the default argument.
    938     unsigned DefaultArgKind : 2;
    939 
    940     /// Whether this parameter undergoes K&R argument promotion.
    941     unsigned IsKNRPromoted : 1;
    942 
    943     /// Whether this parameter is an ObjC method parameter or not.
    944     unsigned IsObjCMethodParam : 1;
    945 
    946     /// If IsObjCMethodParam, a Decl::ObjCDeclQualifier.
    947     /// Otherwise, the number of function parameter scopes enclosing
    948     /// the function parameter scope in which this parameter was
    949     /// declared.
    950     unsigned ScopeDepthOrObjCQuals : NumScopeDepthOrObjCQualsBits;
    951 
    952     /// The number of parameters preceding this parameter in the
    953     /// function parameter scope in which it was declared.
    954     unsigned ParameterIndex : NumParameterIndexBits;
    955   };
    956 
    957   class NonParmVarDeclBitfields {
    958     friend class ASTDeclReader;
    959     friend class ImplicitParamDecl;
    960     friend class VarDecl;
    961 
    962     unsigned : NumVarDeclBits;
    963 
    964     // FIXME: We need something similar to CXXRecordDecl::DefinitionData.
    965     /// Whether this variable is a definition which was demoted due to
    966     /// module merge.
    967     unsigned IsThisDeclarationADemotedDefinition : 1;
    968 
    969     /// Whether this variable is the exception variable in a C++ catch
    970     /// or an Objective-C @catch statement.
    971     unsigned ExceptionVar : 1;
    972 
    973     /// Whether this local variable could be allocated in the return
    974     /// slot of its function, enabling the named return value optimization
    975     /// (NRVO).
    976     unsigned NRVOVariable : 1;
    977 
    978     /// Whether this variable is the for-range-declaration in a C++0x
    979     /// for-range statement.
    980     unsigned CXXForRangeDecl : 1;
    981 
    982     /// Whether this variable is the for-in loop declaration in Objective-C.
    983     unsigned ObjCForDecl : 1;
    984 
    985     /// Whether this variable is (C++1z) inline.
    986     unsigned IsInline : 1;
    987 
    988     /// Whether this variable has (C++1z) inline explicitly specified.
    989     unsigned IsInlineSpecified : 1;
    990 
    991     /// Whether this variable is (C++0x) constexpr.
    992     unsigned IsConstexpr : 1;
    993 
    994     /// Whether this variable is the implicit variable for a lambda
    995     /// init-capture.
    996     unsigned IsInitCapture : 1;
    997 
    998     /// Whether this local extern variable's previous declaration was
    999     /// declared in the same block scope. This controls whether we should merge
   1000     /// the type of this declaration with its previous declaration.
   1001     unsigned PreviousDeclInSameBlockScope : 1;
   1002 
   1003     /// Defines kind of the ImplicitParamDecl: 'this', 'self', 'vtt', '_cmd' or
   1004     /// something else.
   1005     unsigned ImplicitParamKind : 3;
   1006 
   1007     unsigned EscapingByref : 1;
   1008   };
   1009 
   1010   union {
   1011     unsigned AllBits;
   1012     VarDeclBitfields VarDeclBits;
   1013     ParmVarDeclBitfields ParmVarDeclBits;
   1014     NonParmVarDeclBitfields NonParmVarDeclBits;
   1015   };
   1016 
   1017   VarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   1018           SourceLocation IdLoc, IdentifierInfo *Id, QualType T,
   1019           TypeSourceInfo *TInfo, StorageClass SC);
   1020 
   1021   using redeclarable_base = Redeclarable<VarDecl>;
   1022 
   1023   VarDecl *getNextRedeclarationImpl() override {
   1024     return getNextRedeclaration();
   1025   }
   1026 
   1027   VarDecl *getPreviousDeclImpl() override {
   1028     return getPreviousDecl();
   1029   }
   1030 
   1031   VarDecl *getMostRecentDeclImpl() override {
   1032     return getMostRecentDecl();
   1033   }
   1034 
   1035 public:
   1036   using redecl_range = redeclarable_base::redecl_range;
   1037   using redecl_iterator = redeclarable_base::redecl_iterator;
   1038 
   1039   using redeclarable_base::redecls_begin;
   1040   using redeclarable_base::redecls_end;
   1041   using redeclarable_base::redecls;
   1042   using redeclarable_base::getPreviousDecl;
   1043   using redeclarable_base::getMostRecentDecl;
   1044   using redeclarable_base::isFirstDecl;
   1045 
   1046   static VarDecl *Create(ASTContext &C, DeclContext *DC,
   1047                          SourceLocation StartLoc, SourceLocation IdLoc,
   1048                          IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
   1049                          StorageClass S);
   1050 
   1051   static VarDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   1052 
   1053   SourceRange getSourceRange() const override LLVM_READONLY;
   1054 
   1055   /// Returns the storage class as written in the source. For the
   1056   /// computed linkage of symbol, see getLinkage.
   1057   StorageClass getStorageClass() const {
   1058     return (StorageClass) VarDeclBits.SClass;
   1059   }
   1060   void setStorageClass(StorageClass SC);
   1061 
   1062   void setTSCSpec(ThreadStorageClassSpecifier TSC) {
   1063     VarDeclBits.TSCSpec = TSC;
   1064     assert(VarDeclBits.TSCSpec == TSC && "truncation");
   1065   }
   1066   ThreadStorageClassSpecifier getTSCSpec() const {
   1067     return static_cast<ThreadStorageClassSpecifier>(VarDeclBits.TSCSpec);
   1068   }
   1069   TLSKind getTLSKind() const;
   1070 
   1071   /// Returns true if a variable with function scope is a non-static local
   1072   /// variable.
   1073   bool hasLocalStorage() const {
   1074     if (getStorageClass() == SC_None) {
   1075       // OpenCL v1.2 s6.5.3: The __constant or constant address space name is
   1076       // used to describe variables allocated in global memory and which are
   1077       // accessed inside a kernel(s) as read-only variables. As such, variables
   1078       // in constant address space cannot have local storage.
   1079       if (getType().getAddressSpace() == LangAS::opencl_constant)
   1080         return false;
   1081       // Second check is for C++11 [dcl.stc]p4.
   1082       return !isFileVarDecl() && getTSCSpec() == TSCS_unspecified;
   1083     }
   1084 
   1085     // Global Named Register (GNU extension)
   1086     if (getStorageClass() == SC_Register && !isLocalVarDeclOrParm())
   1087       return false;
   1088 
   1089     // Return true for:  Auto, Register.
   1090     // Return false for: Extern, Static, PrivateExtern, OpenCLWorkGroupLocal.
   1091 
   1092     return getStorageClass() >= SC_Auto;
   1093   }
   1094 
   1095   /// Returns true if a variable with function scope is a static local
   1096   /// variable.
   1097   bool isStaticLocal() const {
   1098     return (getStorageClass() == SC_Static ||
   1099             // C++11 [dcl.stc]p4
   1100             (getStorageClass() == SC_None && getTSCSpec() == TSCS_thread_local))
   1101       && !isFileVarDecl();
   1102   }
   1103 
   1104   /// Returns true if a variable has extern or __private_extern__
   1105   /// storage.
   1106   bool hasExternalStorage() const {
   1107     return getStorageClass() == SC_Extern ||
   1108            getStorageClass() == SC_PrivateExtern;
   1109   }
   1110 
   1111   /// Returns true for all variables that do not have local storage.
   1112   ///
   1113   /// This includes all global variables as well as static variables declared
   1114   /// within a function.
   1115   bool hasGlobalStorage() const { return !hasLocalStorage(); }
   1116 
   1117   /// Get the storage duration of this variable, per C++ [basic.stc].
   1118   StorageDuration getStorageDuration() const {
   1119     return hasLocalStorage() ? SD_Automatic :
   1120            getTSCSpec() ? SD_Thread : SD_Static;
   1121   }
   1122 
   1123   /// Compute the language linkage.
   1124   LanguageLinkage getLanguageLinkage() const;
   1125 
   1126   /// Determines whether this variable is a variable with external, C linkage.
   1127   bool isExternC() const;
   1128 
   1129   /// Determines whether this variable's context is, or is nested within,
   1130   /// a C++ extern "C" linkage spec.
   1131   bool isInExternCContext() const;
   1132 
   1133   /// Determines whether this variable's context is, or is nested within,
   1134   /// a C++ extern "C++" linkage spec.
   1135   bool isInExternCXXContext() const;
   1136 
   1137   /// Returns true for local variable declarations other than parameters.
   1138   /// Note that this includes static variables inside of functions. It also
   1139   /// includes variables inside blocks.
   1140   ///
   1141   ///   void foo() { int x; static int y; extern int z; }
   1142   bool isLocalVarDecl() const {
   1143     if (getKind() != Decl::Var && getKind() != Decl::Decomposition)
   1144       return false;
   1145     if (const DeclContext *DC = getLexicalDeclContext())
   1146       return DC->getRedeclContext()->isFunctionOrMethod();
   1147     return false;
   1148   }
   1149 
   1150   /// Similar to isLocalVarDecl but also includes parameters.
   1151   bool isLocalVarDeclOrParm() const {
   1152     return isLocalVarDecl() || getKind() == Decl::ParmVar;
   1153   }
   1154 
   1155   /// Similar to isLocalVarDecl, but excludes variables declared in blocks.
   1156   bool isFunctionOrMethodVarDecl() const {
   1157     if (getKind() != Decl::Var && getKind() != Decl::Decomposition)
   1158       return false;
   1159     const DeclContext *DC = getLexicalDeclContext()->getRedeclContext();
   1160     return DC->isFunctionOrMethod() && DC->getDeclKind() != Decl::Block;
   1161   }
   1162 
   1163   /// Determines whether this is a static data member.
   1164   ///
   1165   /// This will only be true in C++, and applies to, e.g., the
   1166   /// variable 'x' in:
   1167   /// \code
   1168   /// struct S {
   1169   ///   static int x;
   1170   /// };
   1171   /// \endcode
   1172   bool isStaticDataMember() const {
   1173     // If it wasn't static, it would be a FieldDecl.
   1174     return getKind() != Decl::ParmVar && getDeclContext()->isRecord();
   1175   }
   1176 
   1177   VarDecl *getCanonicalDecl() override;
   1178   const VarDecl *getCanonicalDecl() const {
   1179     return const_cast<VarDecl*>(this)->getCanonicalDecl();
   1180   }
   1181 
   1182   enum DefinitionKind {
   1183     /// This declaration is only a declaration.
   1184     DeclarationOnly,
   1185 
   1186     /// This declaration is a tentative definition.
   1187     TentativeDefinition,
   1188 
   1189     /// This declaration is definitely a definition.
   1190     Definition
   1191   };
   1192 
   1193   /// Check whether this declaration is a definition. If this could be
   1194   /// a tentative definition (in C), don't check whether there's an overriding
   1195   /// definition.
   1196   DefinitionKind isThisDeclarationADefinition(ASTContext &) const;
   1197   DefinitionKind isThisDeclarationADefinition() const {
   1198     return isThisDeclarationADefinition(getASTContext());
   1199   }
   1200 
   1201   /// Check whether this variable is defined in this translation unit.
   1202   DefinitionKind hasDefinition(ASTContext &) const;
   1203   DefinitionKind hasDefinition() const {
   1204     return hasDefinition(getASTContext());
   1205   }
   1206 
   1207   /// Get the tentative definition that acts as the real definition in a TU.
   1208   /// Returns null if there is a proper definition available.
   1209   VarDecl *getActingDefinition();
   1210   const VarDecl *getActingDefinition() const {
   1211     return const_cast<VarDecl*>(this)->getActingDefinition();
   1212   }
   1213 
   1214   /// Get the real (not just tentative) definition for this declaration.
   1215   VarDecl *getDefinition(ASTContext &);
   1216   const VarDecl *getDefinition(ASTContext &C) const {
   1217     return const_cast<VarDecl*>(this)->getDefinition(C);
   1218   }
   1219   VarDecl *getDefinition() {
   1220     return getDefinition(getASTContext());
   1221   }
   1222   const VarDecl *getDefinition() const {
   1223     return const_cast<VarDecl*>(this)->getDefinition();
   1224   }
   1225 
   1226   /// Determine whether this is or was instantiated from an out-of-line
   1227   /// definition of a static data member.
   1228   bool isOutOfLine() const override;
   1229 
   1230   /// Returns true for file scoped variable declaration.
   1231   bool isFileVarDecl() const {
   1232     Kind K = getKind();
   1233     if (K == ParmVar || K == ImplicitParam)
   1234       return false;
   1235 
   1236     if (getLexicalDeclContext()->getRedeclContext()->isFileContext())
   1237       return true;
   1238 
   1239     if (isStaticDataMember())
   1240       return true;
   1241 
   1242     return false;
   1243   }
   1244 
   1245   /// Get the initializer for this variable, no matter which
   1246   /// declaration it is attached to.
   1247   const Expr *getAnyInitializer() const {
   1248     const VarDecl *D;
   1249     return getAnyInitializer(D);
   1250   }
   1251 
   1252   /// Get the initializer for this variable, no matter which
   1253   /// declaration it is attached to. Also get that declaration.
   1254   const Expr *getAnyInitializer(const VarDecl *&D) const;
   1255 
   1256   bool hasInit() const;
   1257   const Expr *getInit() const {
   1258     return const_cast<VarDecl *>(this)->getInit();
   1259   }
   1260   Expr *getInit();
   1261 
   1262   /// Retrieve the address of the initializer expression.
   1263   Stmt **getInitAddress();
   1264 
   1265   void setInit(Expr *I);
   1266 
   1267   /// Get the initializing declaration of this variable, if any. This is
   1268   /// usually the definition, except that for a static data member it can be
   1269   /// the in-class declaration.
   1270   VarDecl *getInitializingDeclaration();
   1271   const VarDecl *getInitializingDeclaration() const {
   1272     return const_cast<VarDecl *>(this)->getInitializingDeclaration();
   1273   }
   1274 
   1275   /// Determine whether this variable's value might be usable in a
   1276   /// constant expression, according to the relevant language standard.
   1277   /// This only checks properties of the declaration, and does not check
   1278   /// whether the initializer is in fact a constant expression.
   1279   ///
   1280   /// This corresponds to C++20 [expr.const]p3's notion of a
   1281   /// "potentially-constant" variable.
   1282   bool mightBeUsableInConstantExpressions(const ASTContext &C) const;
   1283 
   1284   /// Determine whether this variable's value can be used in a
   1285   /// constant expression, according to the relevant language standard,
   1286   /// including checking whether it was initialized by a constant expression.
   1287   bool isUsableInConstantExpressions(const ASTContext &C) const;
   1288 
   1289   EvaluatedStmt *ensureEvaluatedStmt() const;
   1290   EvaluatedStmt *getEvaluatedStmt() const;
   1291 
   1292   /// Attempt to evaluate the value of the initializer attached to this
   1293   /// declaration, and produce notes explaining why it cannot be evaluated.
   1294   /// Returns a pointer to the value if evaluation succeeded, 0 otherwise.
   1295   APValue *evaluateValue() const;
   1296 
   1297 private:
   1298   APValue *evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
   1299                              bool IsConstantInitialization) const;
   1300 
   1301 public:
   1302   /// Return the already-evaluated value of this variable's
   1303   /// initializer, or NULL if the value is not yet known. Returns pointer
   1304   /// to untyped APValue if the value could not be evaluated.
   1305   APValue *getEvaluatedValue() const;
   1306 
   1307   /// Evaluate the destruction of this variable to determine if it constitutes
   1308   /// constant destruction.
   1309   ///
   1310   /// \pre hasConstantInitialization()
   1311   /// \return \c true if this variable has constant destruction, \c false if
   1312   ///         not.
   1313   bool evaluateDestruction(SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
   1314 
   1315   /// Determine whether this variable has constant initialization.
   1316   ///
   1317   /// This is only set in two cases: when the language semantics require
   1318   /// constant initialization (globals in C and some globals in C++), and when
   1319   /// the variable is usable in constant expressions (constexpr, const int, and
   1320   /// reference variables in C++).
   1321   bool hasConstantInitialization() const;
   1322 
   1323   /// Determine whether the initializer of this variable is an integer constant
   1324   /// expression. For use in C++98, where this affects whether the variable is
   1325   /// usable in constant expressions.
   1326   bool hasICEInitializer(const ASTContext &Context) const;
   1327 
   1328   /// Evaluate the initializer of this variable to determine whether it's a
   1329   /// constant initializer. Should only be called once, after completing the
   1330   /// definition of the variable.
   1331   bool checkForConstantInitialization(
   1332       SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
   1333 
   1334   void setInitStyle(InitializationStyle Style) {
   1335     VarDeclBits.InitStyle = Style;
   1336   }
   1337 
   1338   /// The style of initialization for this declaration.
   1339   ///
   1340   /// C-style initialization is "int x = 1;". Call-style initialization is
   1341   /// a C++98 direct-initializer, e.g. "int x(1);". The Init expression will be
   1342   /// the expression inside the parens or a "ClassType(a,b,c)" class constructor
   1343   /// expression for class types. List-style initialization is C++11 syntax,
   1344   /// e.g. "int x{1};". Clients can distinguish between different forms of
   1345   /// initialization by checking this value. In particular, "int x = {1};" is
   1346   /// C-style, "int x({1})" is call-style, and "int x{1};" is list-style; the
   1347   /// Init expression in all three cases is an InitListExpr.
   1348   InitializationStyle getInitStyle() const {
   1349     return static_cast<InitializationStyle>(VarDeclBits.InitStyle);
   1350   }
   1351 
   1352   /// Whether the initializer is a direct-initializer (list or call).
   1353   bool isDirectInit() const {
   1354     return getInitStyle() != CInit;
   1355   }
   1356 
   1357   /// If this definition should pretend to be a declaration.
   1358   bool isThisDeclarationADemotedDefinition() const {
   1359     return isa<ParmVarDecl>(this) ? false :
   1360       NonParmVarDeclBits.IsThisDeclarationADemotedDefinition;
   1361   }
   1362 
   1363   /// This is a definition which should be demoted to a declaration.
   1364   ///
   1365   /// In some cases (mostly module merging) we can end up with two visible
   1366   /// definitions one of which needs to be demoted to a declaration to keep
   1367   /// the AST invariants.
   1368   void demoteThisDefinitionToDeclaration() {
   1369     assert(isThisDeclarationADefinition() && "Not a definition!");
   1370     assert(!isa<ParmVarDecl>(this) && "Cannot demote ParmVarDecls!");
   1371     NonParmVarDeclBits.IsThisDeclarationADemotedDefinition = 1;
   1372   }
   1373 
   1374   /// Determine whether this variable is the exception variable in a
   1375   /// C++ catch statememt or an Objective-C \@catch statement.
   1376   bool isExceptionVariable() const {
   1377     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.ExceptionVar;
   1378   }
   1379   void setExceptionVariable(bool EV) {
   1380     assert(!isa<ParmVarDecl>(this));
   1381     NonParmVarDeclBits.ExceptionVar = EV;
   1382   }
   1383 
   1384   /// Determine whether this local variable can be used with the named
   1385   /// return value optimization (NRVO).
   1386   ///
   1387   /// The named return value optimization (NRVO) works by marking certain
   1388   /// non-volatile local variables of class type as NRVO objects. These
   1389   /// locals can be allocated within the return slot of their containing
   1390   /// function, in which case there is no need to copy the object to the
   1391   /// return slot when returning from the function. Within the function body,
   1392   /// each return that returns the NRVO object will have this variable as its
   1393   /// NRVO candidate.
   1394   bool isNRVOVariable() const {
   1395     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.NRVOVariable;
   1396   }
   1397   void setNRVOVariable(bool NRVO) {
   1398     assert(!isa<ParmVarDecl>(this));
   1399     NonParmVarDeclBits.NRVOVariable = NRVO;
   1400   }
   1401 
   1402   /// Determine whether this variable is the for-range-declaration in
   1403   /// a C++0x for-range statement.
   1404   bool isCXXForRangeDecl() const {
   1405     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.CXXForRangeDecl;
   1406   }
   1407   void setCXXForRangeDecl(bool FRD) {
   1408     assert(!isa<ParmVarDecl>(this));
   1409     NonParmVarDeclBits.CXXForRangeDecl = FRD;
   1410   }
   1411 
   1412   /// Determine whether this variable is a for-loop declaration for a
   1413   /// for-in statement in Objective-C.
   1414   bool isObjCForDecl() const {
   1415     return NonParmVarDeclBits.ObjCForDecl;
   1416   }
   1417 
   1418   void setObjCForDecl(bool FRD) {
   1419     NonParmVarDeclBits.ObjCForDecl = FRD;
   1420   }
   1421 
   1422   /// Determine whether this variable is an ARC pseudo-__strong variable. A
   1423   /// pseudo-__strong variable has a __strong-qualified type but does not
   1424   /// actually retain the object written into it. Generally such variables are
   1425   /// also 'const' for safety. There are 3 cases where this will be set, 1) if
   1426   /// the variable is annotated with the objc_externally_retained attribute, 2)
   1427   /// if its 'self' in a non-init method, or 3) if its the variable in an for-in
   1428   /// loop.
   1429   bool isARCPseudoStrong() const { return VarDeclBits.ARCPseudoStrong; }
   1430   void setARCPseudoStrong(bool PS) { VarDeclBits.ARCPseudoStrong = PS; }
   1431 
   1432   /// Whether this variable is (C++1z) inline.
   1433   bool isInline() const {
   1434     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInline;
   1435   }
   1436   bool isInlineSpecified() const {
   1437     return isa<ParmVarDecl>(this) ? false
   1438                                   : NonParmVarDeclBits.IsInlineSpecified;
   1439   }
   1440   void setInlineSpecified() {
   1441     assert(!isa<ParmVarDecl>(this));
   1442     NonParmVarDeclBits.IsInline = true;
   1443     NonParmVarDeclBits.IsInlineSpecified = true;
   1444   }
   1445   void setImplicitlyInline() {
   1446     assert(!isa<ParmVarDecl>(this));
   1447     NonParmVarDeclBits.IsInline = true;
   1448   }
   1449 
   1450   /// Whether this variable is (C++11) constexpr.
   1451   bool isConstexpr() const {
   1452     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsConstexpr;
   1453   }
   1454   void setConstexpr(bool IC) {
   1455     assert(!isa<ParmVarDecl>(this));
   1456     NonParmVarDeclBits.IsConstexpr = IC;
   1457   }
   1458 
   1459   /// Whether this variable is the implicit variable for a lambda init-capture.
   1460   bool isInitCapture() const {
   1461     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInitCapture;
   1462   }
   1463   void setInitCapture(bool IC) {
   1464     assert(!isa<ParmVarDecl>(this));
   1465     NonParmVarDeclBits.IsInitCapture = IC;
   1466   }
   1467 
   1468   /// Determine whether this variable is actually a function parameter pack or
   1469   /// init-capture pack.
   1470   bool isParameterPack() const;
   1471 
   1472   /// Whether this local extern variable declaration's previous declaration
   1473   /// was declared in the same block scope. Only correct in C++.
   1474   bool isPreviousDeclInSameBlockScope() const {
   1475     return isa<ParmVarDecl>(this)
   1476                ? false
   1477                : NonParmVarDeclBits.PreviousDeclInSameBlockScope;
   1478   }
   1479   void setPreviousDeclInSameBlockScope(bool Same) {
   1480     assert(!isa<ParmVarDecl>(this));
   1481     NonParmVarDeclBits.PreviousDeclInSameBlockScope = Same;
   1482   }
   1483 
   1484   /// Indicates the capture is a __block variable that is captured by a block
   1485   /// that can potentially escape (a block for which BlockDecl::doesNotEscape
   1486   /// returns false).
   1487   bool isEscapingByref() const;
   1488 
   1489   /// Indicates the capture is a __block variable that is never captured by an
   1490   /// escaping block.
   1491   bool isNonEscapingByref() const;
   1492 
   1493   void setEscapingByref() {
   1494     NonParmVarDeclBits.EscapingByref = true;
   1495   }
   1496 
   1497   /// Retrieve the variable declaration from which this variable could
   1498   /// be instantiated, if it is an instantiation (rather than a non-template).
   1499   VarDecl *getTemplateInstantiationPattern() const;
   1500 
   1501   /// If this variable is an instantiated static data member of a
   1502   /// class template specialization, returns the templated static data member
   1503   /// from which it was instantiated.
   1504   VarDecl *getInstantiatedFromStaticDataMember() const;
   1505 
   1506   /// If this variable is an instantiation of a variable template or a
   1507   /// static data member of a class template, determine what kind of
   1508   /// template specialization or instantiation this is.
   1509   TemplateSpecializationKind getTemplateSpecializationKind() const;
   1510 
   1511   /// Get the template specialization kind of this variable for the purposes of
   1512   /// template instantiation. This differs from getTemplateSpecializationKind()
   1513   /// for an instantiation of a class-scope explicit specialization.
   1514   TemplateSpecializationKind
   1515   getTemplateSpecializationKindForInstantiation() const;
   1516 
   1517   /// If this variable is an instantiation of a variable template or a
   1518   /// static data member of a class template, determine its point of
   1519   /// instantiation.
   1520   SourceLocation getPointOfInstantiation() const;
   1521 
   1522   /// If this variable is an instantiation of a static data member of a
   1523   /// class template specialization, retrieves the member specialization
   1524   /// information.
   1525   MemberSpecializationInfo *getMemberSpecializationInfo() const;
   1526 
   1527   /// For a static data member that was instantiated from a static
   1528   /// data member of a class template, set the template specialiation kind.
   1529   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   1530                         SourceLocation PointOfInstantiation = SourceLocation());
   1531 
   1532   /// Specify that this variable is an instantiation of the
   1533   /// static data member VD.
   1534   void setInstantiationOfStaticDataMember(VarDecl *VD,
   1535                                           TemplateSpecializationKind TSK);
   1536 
   1537   /// Retrieves the variable template that is described by this
   1538   /// variable declaration.
   1539   ///
   1540   /// Every variable template is represented as a VarTemplateDecl and a
   1541   /// VarDecl. The former contains template properties (such as
   1542   /// the template parameter lists) while the latter contains the
   1543   /// actual description of the template's
   1544   /// contents. VarTemplateDecl::getTemplatedDecl() retrieves the
   1545   /// VarDecl that from a VarTemplateDecl, while
   1546   /// getDescribedVarTemplate() retrieves the VarTemplateDecl from
   1547   /// a VarDecl.
   1548   VarTemplateDecl *getDescribedVarTemplate() const;
   1549 
   1550   void setDescribedVarTemplate(VarTemplateDecl *Template);
   1551 
   1552   // Is this variable known to have a definition somewhere in the complete
   1553   // program? This may be true even if the declaration has internal linkage and
   1554   // has no definition within this source file.
   1555   bool isKnownToBeDefined() const;
   1556 
   1557   /// Is destruction of this variable entirely suppressed? If so, the variable
   1558   /// need not have a usable destructor at all.
   1559   bool isNoDestroy(const ASTContext &) const;
   1560 
   1561   /// Would the destruction of this variable have any effect, and if so, what
   1562   /// kind?
   1563   QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const;
   1564 
   1565   // Implement isa/cast/dyncast/etc.
   1566   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1567   static bool classofKind(Kind K) { return K >= firstVar && K <= lastVar; }
   1568 };
   1569 
   1570 class ImplicitParamDecl : public VarDecl {
   1571   void anchor() override;
   1572 
   1573 public:
   1574   /// Defines the kind of the implicit parameter: is this an implicit parameter
   1575   /// with pointer to 'this', 'self', '_cmd', virtual table pointers, captured
   1576   /// context or something else.
   1577   enum ImplicitParamKind : unsigned {
   1578     /// Parameter for Objective-C 'self' argument
   1579     ObjCSelf,
   1580 
   1581     /// Parameter for Objective-C '_cmd' argument
   1582     ObjCCmd,
   1583 
   1584     /// Parameter for C++ 'this' argument
   1585     CXXThis,
   1586 
   1587     /// Parameter for C++ virtual table pointers
   1588     CXXVTT,
   1589 
   1590     /// Parameter for captured context
   1591     CapturedContext,
   1592 
   1593     /// Other implicit parameter
   1594     Other,
   1595   };
   1596 
   1597   /// Create implicit parameter.
   1598   static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC,
   1599                                    SourceLocation IdLoc, IdentifierInfo *Id,
   1600                                    QualType T, ImplicitParamKind ParamKind);
   1601   static ImplicitParamDecl *Create(ASTContext &C, QualType T,
   1602                                    ImplicitParamKind ParamKind);
   1603 
   1604   static ImplicitParamDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   1605 
   1606   ImplicitParamDecl(ASTContext &C, DeclContext *DC, SourceLocation IdLoc,
   1607                     IdentifierInfo *Id, QualType Type,
   1608                     ImplicitParamKind ParamKind)
   1609       : VarDecl(ImplicitParam, C, DC, IdLoc, IdLoc, Id, Type,
   1610                 /*TInfo=*/nullptr, SC_None) {
   1611     NonParmVarDeclBits.ImplicitParamKind = ParamKind;
   1612     setImplicit();
   1613   }
   1614 
   1615   ImplicitParamDecl(ASTContext &C, QualType Type, ImplicitParamKind ParamKind)
   1616       : VarDecl(ImplicitParam, C, /*DC=*/nullptr, SourceLocation(),
   1617                 SourceLocation(), /*Id=*/nullptr, Type,
   1618                 /*TInfo=*/nullptr, SC_None) {
   1619     NonParmVarDeclBits.ImplicitParamKind = ParamKind;
   1620     setImplicit();
   1621   }
   1622 
   1623   /// Returns the implicit parameter kind.
   1624   ImplicitParamKind getParameterKind() const {
   1625     return static_cast<ImplicitParamKind>(NonParmVarDeclBits.ImplicitParamKind);
   1626   }
   1627 
   1628   // Implement isa/cast/dyncast/etc.
   1629   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1630   static bool classofKind(Kind K) { return K == ImplicitParam; }
   1631 };
   1632 
   1633 /// Represents a parameter to a function.
   1634 class ParmVarDecl : public VarDecl {
   1635 public:
   1636   enum { MaxFunctionScopeDepth = 255 };
   1637   enum { MaxFunctionScopeIndex = 255 };
   1638 
   1639 protected:
   1640   ParmVarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   1641               SourceLocation IdLoc, IdentifierInfo *Id, QualType T,
   1642               TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
   1643       : VarDecl(DK, C, DC, StartLoc, IdLoc, Id, T, TInfo, S) {
   1644     assert(ParmVarDeclBits.HasInheritedDefaultArg == false);
   1645     assert(ParmVarDeclBits.DefaultArgKind == DAK_None);
   1646     assert(ParmVarDeclBits.IsKNRPromoted == false);
   1647     assert(ParmVarDeclBits.IsObjCMethodParam == false);
   1648     setDefaultArg(DefArg);
   1649   }
   1650 
   1651 public:
   1652   static ParmVarDecl *Create(ASTContext &C, DeclContext *DC,
   1653                              SourceLocation StartLoc,
   1654                              SourceLocation IdLoc, IdentifierInfo *Id,
   1655                              QualType T, TypeSourceInfo *TInfo,
   1656                              StorageClass S, Expr *DefArg);
   1657 
   1658   static ParmVarDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   1659 
   1660   SourceRange getSourceRange() const override LLVM_READONLY;
   1661 
   1662   void setObjCMethodScopeInfo(unsigned parameterIndex) {
   1663     ParmVarDeclBits.IsObjCMethodParam = true;
   1664     setParameterIndex(parameterIndex);
   1665   }
   1666 
   1667   void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex) {
   1668     assert(!ParmVarDeclBits.IsObjCMethodParam);
   1669 
   1670     ParmVarDeclBits.ScopeDepthOrObjCQuals = scopeDepth;
   1671     assert(ParmVarDeclBits.ScopeDepthOrObjCQuals == scopeDepth
   1672            && "truncation!");
   1673 
   1674     setParameterIndex(parameterIndex);
   1675   }
   1676 
   1677   bool isObjCMethodParameter() const {
   1678     return ParmVarDeclBits.IsObjCMethodParam;
   1679   }
   1680 
   1681   /// Determines whether this parameter is destroyed in the callee function.
   1682   bool isDestroyedInCallee() const;
   1683 
   1684   unsigned getFunctionScopeDepth() const {
   1685     if (ParmVarDeclBits.IsObjCMethodParam) return 0;
   1686     return ParmVarDeclBits.ScopeDepthOrObjCQuals;
   1687   }
   1688 
   1689   static constexpr unsigned getMaxFunctionScopeDepth() {
   1690     return (1u << NumScopeDepthOrObjCQualsBits) - 1;
   1691   }
   1692 
   1693   /// Returns the index of this parameter in its prototype or method scope.
   1694   unsigned getFunctionScopeIndex() const {
   1695     return getParameterIndex();
   1696   }
   1697 
   1698   ObjCDeclQualifier getObjCDeclQualifier() const {
   1699     if (!ParmVarDeclBits.IsObjCMethodParam) return OBJC_TQ_None;
   1700     return ObjCDeclQualifier(ParmVarDeclBits.ScopeDepthOrObjCQuals);
   1701   }
   1702   void setObjCDeclQualifier(ObjCDeclQualifier QTVal) {
   1703     assert(ParmVarDeclBits.IsObjCMethodParam);
   1704     ParmVarDeclBits.ScopeDepthOrObjCQuals = QTVal;
   1705   }
   1706 
   1707   /// True if the value passed to this parameter must undergo
   1708   /// K&R-style default argument promotion:
   1709   ///
   1710   /// C99 6.5.2.2.
   1711   ///   If the expression that denotes the called function has a type
   1712   ///   that does not include a prototype, the integer promotions are
   1713   ///   performed on each argument, and arguments that have type float
   1714   ///   are promoted to double.
   1715   bool isKNRPromoted() const {
   1716     return ParmVarDeclBits.IsKNRPromoted;
   1717   }
   1718   void setKNRPromoted(bool promoted) {
   1719     ParmVarDeclBits.IsKNRPromoted = promoted;
   1720   }
   1721 
   1722   Expr *getDefaultArg();
   1723   const Expr *getDefaultArg() const {
   1724     return const_cast<ParmVarDecl *>(this)->getDefaultArg();
   1725   }
   1726 
   1727   void setDefaultArg(Expr *defarg);
   1728 
   1729   /// Retrieve the source range that covers the entire default
   1730   /// argument.
   1731   SourceRange getDefaultArgRange() const;
   1732   void setUninstantiatedDefaultArg(Expr *arg);
   1733   Expr *getUninstantiatedDefaultArg();
   1734   const Expr *getUninstantiatedDefaultArg() const {
   1735     return const_cast<ParmVarDecl *>(this)->getUninstantiatedDefaultArg();
   1736   }
   1737 
   1738   /// Determines whether this parameter has a default argument,
   1739   /// either parsed or not.
   1740   bool hasDefaultArg() const;
   1741 
   1742   /// Determines whether this parameter has a default argument that has not
   1743   /// yet been parsed. This will occur during the processing of a C++ class
   1744   /// whose member functions have default arguments, e.g.,
   1745   /// @code
   1746   ///   class X {
   1747   ///   public:
   1748   ///     void f(int x = 17); // x has an unparsed default argument now
   1749   ///   }; // x has a regular default argument now
   1750   /// @endcode
   1751   bool hasUnparsedDefaultArg() const {
   1752     return ParmVarDeclBits.DefaultArgKind == DAK_Unparsed;
   1753   }
   1754 
   1755   bool hasUninstantiatedDefaultArg() const {
   1756     return ParmVarDeclBits.DefaultArgKind == DAK_Uninstantiated;
   1757   }
   1758 
   1759   /// Specify that this parameter has an unparsed default argument.
   1760   /// The argument will be replaced with a real default argument via
   1761   /// setDefaultArg when the class definition enclosing the function
   1762   /// declaration that owns this default argument is completed.
   1763   void setUnparsedDefaultArg() {
   1764     ParmVarDeclBits.DefaultArgKind = DAK_Unparsed;
   1765   }
   1766 
   1767   bool hasInheritedDefaultArg() const {
   1768     return ParmVarDeclBits.HasInheritedDefaultArg;
   1769   }
   1770 
   1771   void setHasInheritedDefaultArg(bool I = true) {
   1772     ParmVarDeclBits.HasInheritedDefaultArg = I;
   1773   }
   1774 
   1775   QualType getOriginalType() const;
   1776 
   1777   /// Sets the function declaration that owns this
   1778   /// ParmVarDecl. Since ParmVarDecls are often created before the
   1779   /// FunctionDecls that own them, this routine is required to update
   1780   /// the DeclContext appropriately.
   1781   void setOwningFunction(DeclContext *FD) { setDeclContext(FD); }
   1782 
   1783   // Implement isa/cast/dyncast/etc.
   1784   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1785   static bool classofKind(Kind K) { return K == ParmVar; }
   1786 
   1787 private:
   1788   enum { ParameterIndexSentinel = (1 << NumParameterIndexBits) - 1 };
   1789 
   1790   void setParameterIndex(unsigned parameterIndex) {
   1791     if (parameterIndex >= ParameterIndexSentinel) {
   1792       setParameterIndexLarge(parameterIndex);
   1793       return;
   1794     }
   1795 
   1796     ParmVarDeclBits.ParameterIndex = parameterIndex;
   1797     assert(ParmVarDeclBits.ParameterIndex == parameterIndex && "truncation!");
   1798   }
   1799   unsigned getParameterIndex() const {
   1800     unsigned d = ParmVarDeclBits.ParameterIndex;
   1801     return d == ParameterIndexSentinel ? getParameterIndexLarge() : d;
   1802   }
   1803 
   1804   void setParameterIndexLarge(unsigned parameterIndex);
   1805   unsigned getParameterIndexLarge() const;
   1806 };
   1807 
   1808 enum class MultiVersionKind {
   1809   None,
   1810   Target,
   1811   CPUSpecific,
   1812   CPUDispatch
   1813 };
   1814 
   1815 /// Represents a function declaration or definition.
   1816 ///
   1817 /// Since a given function can be declared several times in a program,
   1818 /// there may be several FunctionDecls that correspond to that
   1819 /// function. Only one of those FunctionDecls will be found when
   1820 /// traversing the list of declarations in the context of the
   1821 /// FunctionDecl (e.g., the translation unit); this FunctionDecl
   1822 /// contains all of the information known about the function. Other,
   1823 /// previous declarations of the function are available via the
   1824 /// getPreviousDecl() chain.
   1825 class FunctionDecl : public DeclaratorDecl,
   1826                      public DeclContext,
   1827                      public Redeclarable<FunctionDecl> {
   1828   // This class stores some data in DeclContext::FunctionDeclBits
   1829   // to save some space. Use the provided accessors to access it.
   1830 public:
   1831   /// The kind of templated function a FunctionDecl can be.
   1832   enum TemplatedKind {
   1833     // Not templated.
   1834     TK_NonTemplate,
   1835     // The pattern in a function template declaration.
   1836     TK_FunctionTemplate,
   1837     // A non-template function that is an instantiation or explicit
   1838     // specialization of a member of a templated class.
   1839     TK_MemberSpecialization,
   1840     // An instantiation or explicit specialization of a function template.
   1841     // Note: this might have been instantiated from a templated class if it
   1842     // is a class-scope explicit specialization.
   1843     TK_FunctionTemplateSpecialization,
   1844     // A function template specialization that hasn't yet been resolved to a
   1845     // particular specialized function template.
   1846     TK_DependentFunctionTemplateSpecialization
   1847   };
   1848 
   1849   /// Stashed information about a defaulted function definition whose body has
   1850   /// not yet been lazily generated.
   1851   class DefaultedFunctionInfo final
   1852       : llvm::TrailingObjects<DefaultedFunctionInfo, DeclAccessPair> {
   1853     friend TrailingObjects;
   1854     unsigned NumLookups;
   1855 
   1856   public:
   1857     static DefaultedFunctionInfo *Create(ASTContext &Context,
   1858                                          ArrayRef<DeclAccessPair> Lookups);
   1859     /// Get the unqualified lookup results that should be used in this
   1860     /// defaulted function definition.
   1861     ArrayRef<DeclAccessPair> getUnqualifiedLookups() const {
   1862       return {getTrailingObjects<DeclAccessPair>(), NumLookups};
   1863     }
   1864   };
   1865 
   1866 private:
   1867   /// A new[]'d array of pointers to VarDecls for the formal
   1868   /// parameters of this function.  This is null if a prototype or if there are
   1869   /// no formals.
   1870   ParmVarDecl **ParamInfo = nullptr;
   1871 
   1872   /// The active member of this union is determined by
   1873   /// FunctionDeclBits.HasDefaultedFunctionInfo.
   1874   union {
   1875     /// The body of the function.
   1876     LazyDeclStmtPtr Body;
   1877     /// Information about a future defaulted function definition.
   1878     DefaultedFunctionInfo *DefaultedInfo;
   1879   };
   1880 
   1881   unsigned ODRHash;
   1882 
   1883   /// End part of this FunctionDecl's source range.
   1884   ///
   1885   /// We could compute the full range in getSourceRange(). However, when we're
   1886   /// dealing with a function definition deserialized from a PCH/AST file,
   1887   /// we can only compute the full range once the function body has been
   1888   /// de-serialized, so it's far better to have the (sometimes-redundant)
   1889   /// EndRangeLoc.
   1890   SourceLocation EndRangeLoc;
   1891 
   1892   /// The template or declaration that this declaration
   1893   /// describes or was instantiated from, respectively.
   1894   ///
   1895   /// For non-templates, this value will be NULL. For function
   1896   /// declarations that describe a function template, this will be a
   1897   /// pointer to a FunctionTemplateDecl. For member functions
   1898   /// of class template specializations, this will be a MemberSpecializationInfo
   1899   /// pointer containing information about the specialization.
   1900   /// For function template specializations, this will be a
   1901   /// FunctionTemplateSpecializationInfo, which contains information about
   1902   /// the template being specialized and the template arguments involved in
   1903   /// that specialization.
   1904   llvm::PointerUnion<FunctionTemplateDecl *,
   1905                      MemberSpecializationInfo *,
   1906                      FunctionTemplateSpecializationInfo *,
   1907                      DependentFunctionTemplateSpecializationInfo *>
   1908     TemplateOrSpecialization;
   1909 
   1910   /// Provides source/type location info for the declaration name embedded in
   1911   /// the DeclaratorDecl base class.
   1912   DeclarationNameLoc DNLoc;
   1913 
   1914   /// Specify that this function declaration is actually a function
   1915   /// template specialization.
   1916   ///
   1917   /// \param C the ASTContext.
   1918   ///
   1919   /// \param Template the function template that this function template
   1920   /// specialization specializes.
   1921   ///
   1922   /// \param TemplateArgs the template arguments that produced this
   1923   /// function template specialization from the template.
   1924   ///
   1925   /// \param InsertPos If non-NULL, the position in the function template
   1926   /// specialization set where the function template specialization data will
   1927   /// be inserted.
   1928   ///
   1929   /// \param TSK the kind of template specialization this is.
   1930   ///
   1931   /// \param TemplateArgsAsWritten location info of template arguments.
   1932   ///
   1933   /// \param PointOfInstantiation point at which the function template
   1934   /// specialization was first instantiated.
   1935   void setFunctionTemplateSpecialization(ASTContext &C,
   1936                                          FunctionTemplateDecl *Template,
   1937                                        const TemplateArgumentList *TemplateArgs,
   1938                                          void *InsertPos,
   1939                                          TemplateSpecializationKind TSK,
   1940                           const TemplateArgumentListInfo *TemplateArgsAsWritten,
   1941                                          SourceLocation PointOfInstantiation);
   1942 
   1943   /// Specify that this record is an instantiation of the
   1944   /// member function FD.
   1945   void setInstantiationOfMemberFunction(ASTContext &C, FunctionDecl *FD,
   1946                                         TemplateSpecializationKind TSK);
   1947 
   1948   void setParams(ASTContext &C, ArrayRef<ParmVarDecl *> NewParamInfo);
   1949 
   1950   // This is unfortunately needed because ASTDeclWriter::VisitFunctionDecl
   1951   // need to access this bit but we want to avoid making ASTDeclWriter
   1952   // a friend of FunctionDeclBitfields just for this.
   1953   bool isDeletedBit() const { return FunctionDeclBits.IsDeleted; }
   1954 
   1955   /// Whether an ODRHash has been stored.
   1956   bool hasODRHash() const { return FunctionDeclBits.HasODRHash; }
   1957 
   1958   /// State that an ODRHash has been stored.
   1959   void setHasODRHash(bool B = true) { FunctionDeclBits.HasODRHash = B; }
   1960 
   1961 protected:
   1962   FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   1963                const DeclarationNameInfo &NameInfo, QualType T,
   1964                TypeSourceInfo *TInfo, StorageClass S, bool isInlineSpecified,
   1965                ConstexprSpecKind ConstexprKind,
   1966                Expr *TrailingRequiresClause = nullptr);
   1967 
   1968   using redeclarable_base = Redeclarable<FunctionDecl>;
   1969 
   1970   FunctionDecl *getNextRedeclarationImpl() override {
   1971     return getNextRedeclaration();
   1972   }
   1973 
   1974   FunctionDecl *getPreviousDeclImpl() override {
   1975     return getPreviousDecl();
   1976   }
   1977 
   1978   FunctionDecl *getMostRecentDeclImpl() override {
   1979     return getMostRecentDecl();
   1980   }
   1981 
   1982 public:
   1983   friend class ASTDeclReader;
   1984   friend class ASTDeclWriter;
   1985 
   1986   using redecl_range = redeclarable_base::redecl_range;
   1987   using redecl_iterator = redeclarable_base::redecl_iterator;
   1988 
   1989   using redeclarable_base::redecls_begin;
   1990   using redeclarable_base::redecls_end;
   1991   using redeclarable_base::redecls;
   1992   using redeclarable_base::getPreviousDecl;
   1993   using redeclarable_base::getMostRecentDecl;
   1994   using redeclarable_base::isFirstDecl;
   1995 
   1996   static FunctionDecl *
   1997   Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   1998          SourceLocation NLoc, DeclarationName N, QualType T,
   1999          TypeSourceInfo *TInfo, StorageClass SC, bool isInlineSpecified = false,
   2000          bool hasWrittenPrototype = true,
   2001          ConstexprSpecKind ConstexprKind = ConstexprSpecKind::Unspecified,
   2002          Expr *TrailingRequiresClause = nullptr) {
   2003     DeclarationNameInfo NameInfo(N, NLoc);
   2004     return FunctionDecl::Create(C, DC, StartLoc, NameInfo, T, TInfo, SC,
   2005                                 isInlineSpecified, hasWrittenPrototype,
   2006                                 ConstexprKind, TrailingRequiresClause);
   2007   }
   2008 
   2009   static FunctionDecl *Create(ASTContext &C, DeclContext *DC,
   2010                               SourceLocation StartLoc,
   2011                               const DeclarationNameInfo &NameInfo, QualType T,
   2012                               TypeSourceInfo *TInfo, StorageClass SC,
   2013                               bool isInlineSpecified, bool hasWrittenPrototype,
   2014                               ConstexprSpecKind ConstexprKind,
   2015                               Expr *TrailingRequiresClause);
   2016 
   2017   static FunctionDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   2018 
   2019   DeclarationNameInfo getNameInfo() const {
   2020     return DeclarationNameInfo(getDeclName(), getLocation(), DNLoc);
   2021   }
   2022 
   2023   void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy,
   2024                             bool Qualified) const override;
   2025 
   2026   void setRangeEnd(SourceLocation E) { EndRangeLoc = E; }
   2027 
   2028   /// Returns the location of the ellipsis of a variadic function.
   2029   SourceLocation getEllipsisLoc() const {
   2030     const auto *FPT = getType()->getAs<FunctionProtoType>();
   2031     if (FPT && FPT->isVariadic())
   2032       return FPT->getEllipsisLoc();
   2033     return SourceLocation();
   2034   }
   2035 
   2036   SourceRange getSourceRange() const override LLVM_READONLY;
   2037 
   2038   // Function definitions.
   2039   //
   2040   // A function declaration may be:
   2041   // - a non defining declaration,
   2042   // - a definition. A function may be defined because:
   2043   //   - it has a body, or will have it in the case of late parsing.
   2044   //   - it has an uninstantiated body. The body does not exist because the
   2045   //     function is not used yet, but the declaration is considered a
   2046   //     definition and does not allow other definition of this function.
   2047   //   - it does not have a user specified body, but it does not allow
   2048   //     redefinition, because it is deleted/defaulted or is defined through
   2049   //     some other mechanism (alias, ifunc).
   2050 
   2051   /// Returns true if the function has a body.
   2052   ///
   2053   /// The function body might be in any of the (re-)declarations of this
   2054   /// function. The variant that accepts a FunctionDecl pointer will set that
   2055   /// function declaration to the actual declaration containing the body (if
   2056   /// there is one).
   2057   bool hasBody(const FunctionDecl *&Definition) const;
   2058 
   2059   bool hasBody() const override {
   2060     const FunctionDecl* Definition;
   2061     return hasBody(Definition);
   2062   }
   2063 
   2064   /// Returns whether the function has a trivial body that does not require any
   2065   /// specific codegen.
   2066   bool hasTrivialBody() const;
   2067 
   2068   /// Returns true if the function has a definition that does not need to be
   2069   /// instantiated.
   2070   ///
   2071   /// The variant that accepts a FunctionDecl pointer will set that function
   2072   /// declaration to the declaration that is a definition (if there is one).
   2073   ///
   2074   /// \param CheckForPendingFriendDefinition If \c true, also check for friend
   2075   ///        declarations that were instantiataed from function definitions.
   2076   ///        Such a declaration behaves as if it is a definition for the
   2077   ///        purpose of redefinition checking, but isn't actually a "real"
   2078   ///        definition until its body is instantiated.
   2079   bool isDefined(const FunctionDecl *&Definition,
   2080                  bool CheckForPendingFriendDefinition = false) const;
   2081 
   2082   bool isDefined() const {
   2083     const FunctionDecl* Definition;
   2084     return isDefined(Definition);
   2085   }
   2086 
   2087   /// Get the definition for this declaration.
   2088   FunctionDecl *getDefinition() {
   2089     const FunctionDecl *Definition;
   2090     if (isDefined(Definition))
   2091       return const_cast<FunctionDecl *>(Definition);
   2092     return nullptr;
   2093   }
   2094   const FunctionDecl *getDefinition() const {
   2095     return const_cast<FunctionDecl *>(this)->getDefinition();
   2096   }
   2097 
   2098   /// Retrieve the body (definition) of the function. The function body might be
   2099   /// in any of the (re-)declarations of this function. The variant that accepts
   2100   /// a FunctionDecl pointer will set that function declaration to the actual
   2101   /// declaration containing the body (if there is one).
   2102   /// NOTE: For checking if there is a body, use hasBody() instead, to avoid
   2103   /// unnecessary AST de-serialization of the body.
   2104   Stmt *getBody(const FunctionDecl *&Definition) const;
   2105 
   2106   Stmt *getBody() const override {
   2107     const FunctionDecl* Definition;
   2108     return getBody(Definition);
   2109   }
   2110 
   2111   /// Returns whether this specific declaration of the function is also a
   2112   /// definition that does not contain uninstantiated body.
   2113   ///
   2114   /// This does not determine whether the function has been defined (e.g., in a
   2115   /// previous definition); for that information, use isDefined.
   2116   ///
   2117   /// Note: the function declaration does not become a definition until the
   2118   /// parser reaches the definition, if called before, this function will return
   2119   /// `false`.
   2120   bool isThisDeclarationADefinition() const {
   2121     return isDeletedAsWritten() || isDefaulted() ||
   2122            doesThisDeclarationHaveABody() || hasSkippedBody() ||
   2123            willHaveBody() || hasDefiningAttr();
   2124   }
   2125 
   2126   /// Determine whether this specific declaration of the function is a friend
   2127   /// declaration that was instantiated from a function definition. Such
   2128   /// declarations behave like definitions in some contexts.
   2129   bool isThisDeclarationInstantiatedFromAFriendDefinition() const;
   2130 
   2131   /// Returns whether this specific declaration of the function has a body.
   2132   bool doesThisDeclarationHaveABody() const {
   2133     return (!FunctionDeclBits.HasDefaultedFunctionInfo && Body) ||
   2134            isLateTemplateParsed();
   2135   }
   2136 
   2137   void setBody(Stmt *B);
   2138   void setLazyBody(uint64_t Offset) {
   2139     FunctionDeclBits.HasDefaultedFunctionInfo = false;
   2140     Body = LazyDeclStmtPtr(Offset);
   2141   }
   2142 
   2143   void setDefaultedFunctionInfo(DefaultedFunctionInfo *Info);
   2144   DefaultedFunctionInfo *getDefaultedFunctionInfo() const;
   2145 
   2146   /// Whether this function is variadic.
   2147   bool isVariadic() const;
   2148 
   2149   /// Whether this function is marked as virtual explicitly.
   2150   bool isVirtualAsWritten() const {
   2151     return FunctionDeclBits.IsVirtualAsWritten;
   2152   }
   2153 
   2154   /// State that this function is marked as virtual explicitly.
   2155   void setVirtualAsWritten(bool V) { FunctionDeclBits.IsVirtualAsWritten = V; }
   2156 
   2157   /// Whether this virtual function is pure, i.e. makes the containing class
   2158   /// abstract.
   2159   bool isPure() const { return FunctionDeclBits.IsPure; }
   2160   void setPure(bool P = true);
   2161 
   2162   /// Whether this templated function will be late parsed.
   2163   bool isLateTemplateParsed() const {
   2164     return FunctionDeclBits.IsLateTemplateParsed;
   2165   }
   2166 
   2167   /// State that this templated function will be late parsed.
   2168   void setLateTemplateParsed(bool ILT = true) {
   2169     FunctionDeclBits.IsLateTemplateParsed = ILT;
   2170   }
   2171 
   2172   /// Whether this function is "trivial" in some specialized C++ senses.
   2173   /// Can only be true for default constructors, copy constructors,
   2174   /// copy assignment operators, and destructors.  Not meaningful until
   2175   /// the class has been fully built by Sema.
   2176   bool isTrivial() const { return FunctionDeclBits.IsTrivial; }
   2177   void setTrivial(bool IT) { FunctionDeclBits.IsTrivial = IT; }
   2178 
   2179   bool isTrivialForCall() const { return FunctionDeclBits.IsTrivialForCall; }
   2180   void setTrivialForCall(bool IT) { FunctionDeclBits.IsTrivialForCall = IT; }
   2181 
   2182   /// Whether this function is defaulted. Valid for e.g.
   2183   /// special member functions, defaulted comparisions (not methods!).
   2184   bool isDefaulted() const { return FunctionDeclBits.IsDefaulted; }
   2185   void setDefaulted(bool D = true) { FunctionDeclBits.IsDefaulted = D; }
   2186 
   2187   /// Whether this function is explicitly defaulted.
   2188   bool isExplicitlyDefaulted() const {
   2189     return FunctionDeclBits.IsExplicitlyDefaulted;
   2190   }
   2191 
   2192   /// State that this function is explicitly defaulted.
   2193   void setExplicitlyDefaulted(bool ED = true) {
   2194     FunctionDeclBits.IsExplicitlyDefaulted = ED;
   2195   }
   2196 
   2197   /// True if this method is user-declared and was not
   2198   /// deleted or defaulted on its first declaration.
   2199   bool isUserProvided() const {
   2200     auto *DeclAsWritten = this;
   2201     if (FunctionDecl *Pattern = getTemplateInstantiationPattern())
   2202       DeclAsWritten = Pattern;
   2203     return !(DeclAsWritten->isDeleted() ||
   2204              DeclAsWritten->getCanonicalDecl()->isDefaulted());
   2205   }
   2206 
   2207   /// Whether falling off this function implicitly returns null/zero.
   2208   /// If a more specific implicit return value is required, front-ends
   2209   /// should synthesize the appropriate return statements.
   2210   bool hasImplicitReturnZero() const {
   2211     return FunctionDeclBits.HasImplicitReturnZero;
   2212   }
   2213 
   2214   /// State that falling off this function implicitly returns null/zero.
   2215   /// If a more specific implicit return value is required, front-ends
   2216   /// should synthesize the appropriate return statements.
   2217   void setHasImplicitReturnZero(bool IRZ) {
   2218     FunctionDeclBits.HasImplicitReturnZero = IRZ;
   2219   }
   2220 
   2221   /// Whether this function has a prototype, either because one
   2222   /// was explicitly written or because it was "inherited" by merging
   2223   /// a declaration without a prototype with a declaration that has a
   2224   /// prototype.
   2225   bool hasPrototype() const {
   2226     return hasWrittenPrototype() || hasInheritedPrototype();
   2227   }
   2228 
   2229   /// Whether this function has a written prototype.
   2230   bool hasWrittenPrototype() const {
   2231     return FunctionDeclBits.HasWrittenPrototype;
   2232   }
   2233 
   2234   /// State that this function has a written prototype.
   2235   void setHasWrittenPrototype(bool P = true) {
   2236     FunctionDeclBits.HasWrittenPrototype = P;
   2237   }
   2238 
   2239   /// Whether this function inherited its prototype from a
   2240   /// previous declaration.
   2241   bool hasInheritedPrototype() const {
   2242     return FunctionDeclBits.HasInheritedPrototype;
   2243   }
   2244 
   2245   /// State that this function inherited its prototype from a
   2246   /// previous declaration.
   2247   void setHasInheritedPrototype(bool P = true) {
   2248     FunctionDeclBits.HasInheritedPrototype = P;
   2249   }
   2250 
   2251   /// Whether this is a (C++11) constexpr function or constexpr constructor.
   2252   bool isConstexpr() const {
   2253     return getConstexprKind() != ConstexprSpecKind::Unspecified;
   2254   }
   2255   void setConstexprKind(ConstexprSpecKind CSK) {
   2256     FunctionDeclBits.ConstexprKind = static_cast<uint64_t>(CSK);
   2257   }
   2258   ConstexprSpecKind getConstexprKind() const {
   2259     return static_cast<ConstexprSpecKind>(FunctionDeclBits.ConstexprKind);
   2260   }
   2261   bool isConstexprSpecified() const {
   2262     return getConstexprKind() == ConstexprSpecKind::Constexpr;
   2263   }
   2264   bool isConsteval() const {
   2265     return getConstexprKind() == ConstexprSpecKind::Consteval;
   2266   }
   2267 
   2268   /// Whether the instantiation of this function is pending.
   2269   /// This bit is set when the decision to instantiate this function is made
   2270   /// and unset if and when the function body is created. That leaves out
   2271   /// cases where instantiation did not happen because the template definition
   2272   /// was not seen in this TU. This bit remains set in those cases, under the
   2273   /// assumption that the instantiation will happen in some other TU.
   2274   bool instantiationIsPending() const {
   2275     return FunctionDeclBits.InstantiationIsPending;
   2276   }
   2277 
   2278   /// State that the instantiation of this function is pending.
   2279   /// (see instantiationIsPending)
   2280   void setInstantiationIsPending(bool IC) {
   2281     FunctionDeclBits.InstantiationIsPending = IC;
   2282   }
   2283 
   2284   /// Indicates the function uses __try.
   2285   bool usesSEHTry() const { return FunctionDeclBits.UsesSEHTry; }
   2286   void setUsesSEHTry(bool UST) { FunctionDeclBits.UsesSEHTry = UST; }
   2287 
   2288   /// Whether this function has been deleted.
   2289   ///
   2290   /// A function that is "deleted" (via the C++0x "= delete" syntax)
   2291   /// acts like a normal function, except that it cannot actually be
   2292   /// called or have its address taken. Deleted functions are
   2293   /// typically used in C++ overload resolution to attract arguments
   2294   /// whose type or lvalue/rvalue-ness would permit the use of a
   2295   /// different overload that would behave incorrectly. For example,
   2296   /// one might use deleted functions to ban implicit conversion from
   2297   /// a floating-point number to an Integer type:
   2298   ///
   2299   /// @code
   2300   /// struct Integer {
   2301   ///   Integer(long); // construct from a long
   2302   ///   Integer(double) = delete; // no construction from float or double
   2303   ///   Integer(long double) = delete; // no construction from long double
   2304   /// };
   2305   /// @endcode
   2306   // If a function is deleted, its first declaration must be.
   2307   bool isDeleted() const {
   2308     return getCanonicalDecl()->FunctionDeclBits.IsDeleted;
   2309   }
   2310 
   2311   bool isDeletedAsWritten() const {
   2312     return FunctionDeclBits.IsDeleted && !isDefaulted();
   2313   }
   2314 
   2315   void setDeletedAsWritten(bool D = true) { FunctionDeclBits.IsDeleted = D; }
   2316 
   2317   /// Determines whether this function is "main", which is the
   2318   /// entry point into an executable program.
   2319   bool isMain() const;
   2320 
   2321   /// Determines whether this function is a MSVCRT user defined entry
   2322   /// point.
   2323   bool isMSVCRTEntryPoint() const;
   2324 
   2325   /// Determines whether this operator new or delete is one
   2326   /// of the reserved global placement operators:
   2327   ///    void *operator new(size_t, void *);
   2328   ///    void *operator new[](size_t, void *);
   2329   ///    void operator delete(void *, void *);
   2330   ///    void operator delete[](void *, void *);
   2331   /// These functions have special behavior under [new.delete.placement]:
   2332   ///    These functions are reserved, a C++ program may not define
   2333   ///    functions that displace the versions in the Standard C++ library.
   2334   ///    The provisions of [basic.stc.dynamic] do not apply to these
   2335   ///    reserved placement forms of operator new and operator delete.
   2336   ///
   2337   /// This function must be an allocation or deallocation function.
   2338   bool isReservedGlobalPlacementOperator() const;
   2339 
   2340   /// Determines whether this function is one of the replaceable
   2341   /// global allocation functions:
   2342   ///    void *operator new(size_t);
   2343   ///    void *operator new(size_t, const std::nothrow_t &) noexcept;
   2344   ///    void *operator new[](size_t);
   2345   ///    void *operator new[](size_t, const std::nothrow_t &) noexcept;
   2346   ///    void operator delete(void *) noexcept;
   2347   ///    void operator delete(void *, std::size_t) noexcept;      [C++1y]
   2348   ///    void operator delete(void *, const std::nothrow_t &) noexcept;
   2349   ///    void operator delete[](void *) noexcept;
   2350   ///    void operator delete[](void *, std::size_t) noexcept;    [C++1y]
   2351   ///    void operator delete[](void *, const std::nothrow_t &) noexcept;
   2352   /// These functions have special behavior under C++1y [expr.new]:
   2353   ///    An implementation is allowed to omit a call to a replaceable global
   2354   ///    allocation function. [...]
   2355   ///
   2356   /// If this function is an aligned allocation/deallocation function, return
   2357   /// the parameter number of the requested alignment through AlignmentParam.
   2358   ///
   2359   /// If this function is an allocation/deallocation function that takes
   2360   /// the `std::nothrow_t` tag, return true through IsNothrow,
   2361   bool isReplaceableGlobalAllocationFunction(
   2362       Optional<unsigned> *AlignmentParam = nullptr,
   2363       bool *IsNothrow = nullptr) const;
   2364 
   2365   /// Determine if this function provides an inline implementation of a builtin.
   2366   bool isInlineBuiltinDeclaration() const;
   2367 
   2368   /// Determine whether this is a destroying operator delete.
   2369   bool isDestroyingOperatorDelete() const;
   2370 
   2371   /// Compute the language linkage.
   2372   LanguageLinkage getLanguageLinkage() const;
   2373 
   2374   /// Determines whether this function is a function with
   2375   /// external, C linkage.
   2376   bool isExternC() const;
   2377 
   2378   /// Determines whether this function's context is, or is nested within,
   2379   /// a C++ extern "C" linkage spec.
   2380   bool isInExternCContext() const;
   2381 
   2382   /// Determines whether this function's context is, or is nested within,
   2383   /// a C++ extern "C++" linkage spec.
   2384   bool isInExternCXXContext() const;
   2385 
   2386   /// Determines whether this is a global function.
   2387   bool isGlobal() const;
   2388 
   2389   /// Determines whether this function is known to be 'noreturn', through
   2390   /// an attribute on its declaration or its type.
   2391   bool isNoReturn() const;
   2392 
   2393   /// True if the function was a definition but its body was skipped.
   2394   bool hasSkippedBody() const { return FunctionDeclBits.HasSkippedBody; }
   2395   void setHasSkippedBody(bool Skipped = true) {
   2396     FunctionDeclBits.HasSkippedBody = Skipped;
   2397   }
   2398 
   2399   /// True if this function will eventually have a body, once it's fully parsed.
   2400   bool willHaveBody() const { return FunctionDeclBits.WillHaveBody; }
   2401   void setWillHaveBody(bool V = true) { FunctionDeclBits.WillHaveBody = V; }
   2402 
   2403   /// True if this function is considered a multiversioned function.
   2404   bool isMultiVersion() const {
   2405     return getCanonicalDecl()->FunctionDeclBits.IsMultiVersion;
   2406   }
   2407 
   2408   /// Sets the multiversion state for this declaration and all of its
   2409   /// redeclarations.
   2410   void setIsMultiVersion(bool V = true) {
   2411     getCanonicalDecl()->FunctionDeclBits.IsMultiVersion = V;
   2412   }
   2413 
   2414   /// Gets the kind of multiversioning attribute this declaration has. Note that
   2415   /// this can return a value even if the function is not multiversion, such as
   2416   /// the case of 'target'.
   2417   MultiVersionKind getMultiVersionKind() const;
   2418 
   2419 
   2420   /// True if this function is a multiversioned dispatch function as a part of
   2421   /// the cpu_specific/cpu_dispatch functionality.
   2422   bool isCPUDispatchMultiVersion() const;
   2423   /// True if this function is a multiversioned processor specific function as a
   2424   /// part of the cpu_specific/cpu_dispatch functionality.
   2425   bool isCPUSpecificMultiVersion() const;
   2426 
   2427   /// True if this function is a multiversioned dispatch function as a part of
   2428   /// the target functionality.
   2429   bool isTargetMultiVersion() const;
   2430 
   2431   /// \brief Get the associated-constraints of this function declaration.
   2432   /// Currently, this will either be a vector of size 1 containing the
   2433   /// trailing-requires-clause or an empty vector.
   2434   ///
   2435   /// Use this instead of getTrailingRequiresClause for concepts APIs that
   2436   /// accept an ArrayRef of constraint expressions.
   2437   void getAssociatedConstraints(SmallVectorImpl<const Expr *> &AC) const {
   2438     if (auto *TRC = getTrailingRequiresClause())
   2439       AC.push_back(TRC);
   2440   }
   2441 
   2442   void setPreviousDeclaration(FunctionDecl * PrevDecl);
   2443 
   2444   FunctionDecl *getCanonicalDecl() override;
   2445   const FunctionDecl *getCanonicalDecl() const {
   2446     return const_cast<FunctionDecl*>(this)->getCanonicalDecl();
   2447   }
   2448 
   2449   unsigned getBuiltinID(bool ConsiderWrapperFunctions = false) const;
   2450 
   2451   // ArrayRef interface to parameters.
   2452   ArrayRef<ParmVarDecl *> parameters() const {
   2453     return {ParamInfo, getNumParams()};
   2454   }
   2455   MutableArrayRef<ParmVarDecl *> parameters() {
   2456     return {ParamInfo, getNumParams()};
   2457   }
   2458 
   2459   // Iterator access to formal parameters.
   2460   using param_iterator = MutableArrayRef<ParmVarDecl *>::iterator;
   2461   using param_const_iterator = ArrayRef<ParmVarDecl *>::const_iterator;
   2462 
   2463   bool param_empty() const { return parameters().empty(); }
   2464   param_iterator param_begin() { return parameters().begin(); }
   2465   param_iterator param_end() { return parameters().end(); }
   2466   param_const_iterator param_begin() const { return parameters().begin(); }
   2467   param_const_iterator param_end() const { return parameters().end(); }
   2468   size_t param_size() const { return parameters().size(); }
   2469 
   2470   /// Return the number of parameters this function must have based on its
   2471   /// FunctionType.  This is the length of the ParamInfo array after it has been
   2472   /// created.
   2473   unsigned getNumParams() const;
   2474 
   2475   const ParmVarDecl *getParamDecl(unsigned i) const {
   2476     assert(i < getNumParams() && "Illegal param #");
   2477     return ParamInfo[i];
   2478   }
   2479   ParmVarDecl *getParamDecl(unsigned i) {
   2480     assert(i < getNumParams() && "Illegal param #");
   2481     return ParamInfo[i];
   2482   }
   2483   void setParams(ArrayRef<ParmVarDecl *> NewParamInfo) {
   2484     setParams(getASTContext(), NewParamInfo);
   2485   }
   2486 
   2487   /// Returns the minimum number of arguments needed to call this function. This
   2488   /// may be fewer than the number of function parameters, if some of the
   2489   /// parameters have default arguments (in C++).
   2490   unsigned getMinRequiredArguments() const;
   2491 
   2492   /// Determine whether this function has a single parameter, or multiple
   2493   /// parameters where all but the first have default arguments.
   2494   ///
   2495   /// This notion is used in the definition of copy/move constructors and
   2496   /// initializer list constructors. Note that, unlike getMinRequiredArguments,
   2497   /// parameter packs are not treated specially here.
   2498   bool hasOneParamOrDefaultArgs() const;
   2499 
   2500   /// Find the source location information for how the type of this function
   2501   /// was written. May be absent (for example if the function was declared via
   2502   /// a typedef) and may contain a different type from that of the function
   2503   /// (for example if the function type was adjusted by an attribute).
   2504   FunctionTypeLoc getFunctionTypeLoc() const;
   2505 
   2506   QualType getReturnType() const {
   2507     return getType()->castAs<FunctionType>()->getReturnType();
   2508   }
   2509 
   2510   /// Attempt to compute an informative source range covering the
   2511   /// function return type. This may omit qualifiers and other information with
   2512   /// limited representation in the AST.
   2513   SourceRange getReturnTypeSourceRange() const;
   2514 
   2515   /// Attempt to compute an informative source range covering the
   2516   /// function parameters, including the ellipsis of a variadic function.
   2517   /// The source range excludes the parentheses, and is invalid if there are
   2518   /// no parameters and no ellipsis.
   2519   SourceRange getParametersSourceRange() const;
   2520 
   2521   /// Get the declared return type, which may differ from the actual return
   2522   /// type if the return type is deduced.
   2523   QualType getDeclaredReturnType() const {
   2524     auto *TSI = getTypeSourceInfo();
   2525     QualType T = TSI ? TSI->getType() : getType();
   2526     return T->castAs<FunctionType>()->getReturnType();
   2527   }
   2528 
   2529   /// Gets the ExceptionSpecificationType as declared.
   2530   ExceptionSpecificationType getExceptionSpecType() const {
   2531     auto *TSI = getTypeSourceInfo();
   2532     QualType T = TSI ? TSI->getType() : getType();
   2533     const auto *FPT = T->getAs<FunctionProtoType>();
   2534     return FPT ? FPT->getExceptionSpecType() : EST_None;
   2535   }
   2536 
   2537   /// Attempt to compute an informative source range covering the
   2538   /// function exception specification, if any.
   2539   SourceRange getExceptionSpecSourceRange() const;
   2540 
   2541   /// Determine the type of an expression that calls this function.
   2542   QualType getCallResultType() const {
   2543     return getType()->castAs<FunctionType>()->getCallResultType(
   2544         getASTContext());
   2545   }
   2546 
   2547   /// Returns the storage class as written in the source. For the
   2548   /// computed linkage of symbol, see getLinkage.
   2549   StorageClass getStorageClass() const {
   2550     return static_cast<StorageClass>(FunctionDeclBits.SClass);
   2551   }
   2552 
   2553   /// Sets the storage class as written in the source.
   2554   void setStorageClass(StorageClass SClass) {
   2555     FunctionDeclBits.SClass = SClass;
   2556   }
   2557 
   2558   /// Determine whether the "inline" keyword was specified for this
   2559   /// function.
   2560   bool isInlineSpecified() const { return FunctionDeclBits.IsInlineSpecified; }
   2561 
   2562   /// Set whether the "inline" keyword was specified for this function.
   2563   void setInlineSpecified(bool I) {
   2564     FunctionDeclBits.IsInlineSpecified = I;
   2565     FunctionDeclBits.IsInline = I;
   2566   }
   2567 
   2568   /// Flag that this function is implicitly inline.
   2569   void setImplicitlyInline(bool I = true) { FunctionDeclBits.IsInline = I; }
   2570 
   2571   /// Determine whether this function should be inlined, because it is
   2572   /// either marked "inline" or "constexpr" or is a member function of a class
   2573   /// that was defined in the class body.
   2574   bool isInlined() const { return FunctionDeclBits.IsInline; }
   2575 
   2576   bool isInlineDefinitionExternallyVisible() const;
   2577 
   2578   bool isMSExternInline() const;
   2579 
   2580   bool doesDeclarationForceExternallyVisibleDefinition() const;
   2581 
   2582   bool isStatic() const { return getStorageClass() == SC_Static; }
   2583 
   2584   /// Whether this function declaration represents an C++ overloaded
   2585   /// operator, e.g., "operator+".
   2586   bool isOverloadedOperator() const {
   2587     return getOverloadedOperator() != OO_None;
   2588   }
   2589 
   2590   OverloadedOperatorKind getOverloadedOperator() const;
   2591 
   2592   const IdentifierInfo *getLiteralIdentifier() const;
   2593 
   2594   /// If this function is an instantiation of a member function
   2595   /// of a class template specialization, retrieves the function from
   2596   /// which it was instantiated.
   2597   ///
   2598   /// This routine will return non-NULL for (non-templated) member
   2599   /// functions of class templates and for instantiations of function
   2600   /// templates. For example, given:
   2601   ///
   2602   /// \code
   2603   /// template<typename T>
   2604   /// struct X {
   2605   ///   void f(T);
   2606   /// };
   2607   /// \endcode
   2608   ///
   2609   /// The declaration for X<int>::f is a (non-templated) FunctionDecl
   2610   /// whose parent is the class template specialization X<int>. For
   2611   /// this declaration, getInstantiatedFromFunction() will return
   2612   /// the FunctionDecl X<T>::A. When a complete definition of
   2613   /// X<int>::A is required, it will be instantiated from the
   2614   /// declaration returned by getInstantiatedFromMemberFunction().
   2615   FunctionDecl *getInstantiatedFromMemberFunction() const;
   2616 
   2617   /// What kind of templated function this is.
   2618   TemplatedKind getTemplatedKind() const;
   2619 
   2620   /// If this function is an instantiation of a member function of a
   2621   /// class template specialization, retrieves the member specialization
   2622   /// information.
   2623   MemberSpecializationInfo *getMemberSpecializationInfo() const;
   2624 
   2625   /// Specify that this record is an instantiation of the
   2626   /// member function FD.
   2627   void setInstantiationOfMemberFunction(FunctionDecl *FD,
   2628                                         TemplateSpecializationKind TSK) {
   2629     setInstantiationOfMemberFunction(getASTContext(), FD, TSK);
   2630   }
   2631 
   2632   /// Retrieves the function template that is described by this
   2633   /// function declaration.
   2634   ///
   2635   /// Every function template is represented as a FunctionTemplateDecl
   2636   /// and a FunctionDecl (or something derived from FunctionDecl). The
   2637   /// former contains template properties (such as the template
   2638   /// parameter lists) while the latter contains the actual
   2639   /// description of the template's
   2640   /// contents. FunctionTemplateDecl::getTemplatedDecl() retrieves the
   2641   /// FunctionDecl that describes the function template,
   2642   /// getDescribedFunctionTemplate() retrieves the
   2643   /// FunctionTemplateDecl from a FunctionDecl.
   2644   FunctionTemplateDecl *getDescribedFunctionTemplate() const;
   2645 
   2646   void setDescribedFunctionTemplate(FunctionTemplateDecl *Template);
   2647 
   2648   /// Determine whether this function is a function template
   2649   /// specialization.
   2650   bool isFunctionTemplateSpecialization() const {
   2651     return getPrimaryTemplate() != nullptr;
   2652   }
   2653 
   2654   /// If this function is actually a function template specialization,
   2655   /// retrieve information about this function template specialization.
   2656   /// Otherwise, returns NULL.
   2657   FunctionTemplateSpecializationInfo *getTemplateSpecializationInfo() const;
   2658 
   2659   /// Determines whether this function is a function template
   2660   /// specialization or a member of a class template specialization that can
   2661   /// be implicitly instantiated.
   2662   bool isImplicitlyInstantiable() const;
   2663 
   2664   /// Determines if the given function was instantiated from a
   2665   /// function template.
   2666   bool isTemplateInstantiation() const;
   2667 
   2668   /// Retrieve the function declaration from which this function could
   2669   /// be instantiated, if it is an instantiation (rather than a non-template
   2670   /// or a specialization, for example).
   2671   ///
   2672   /// If \p ForDefinition is \c false, explicit specializations will be treated
   2673   /// as if they were implicit instantiations. This will then find the pattern
   2674   /// corresponding to non-definition portions of the declaration, such as
   2675   /// default arguments and the exception specification.
   2676   FunctionDecl *
   2677   getTemplateInstantiationPattern(bool ForDefinition = true) const;
   2678 
   2679   /// Retrieve the primary template that this function template
   2680   /// specialization either specializes or was instantiated from.
   2681   ///
   2682   /// If this function declaration is not a function template specialization,
   2683   /// returns NULL.
   2684   FunctionTemplateDecl *getPrimaryTemplate() const;
   2685 
   2686   /// Retrieve the template arguments used to produce this function
   2687   /// template specialization from the primary template.
   2688   ///
   2689   /// If this function declaration is not a function template specialization,
   2690   /// returns NULL.
   2691   const TemplateArgumentList *getTemplateSpecializationArgs() const;
   2692 
   2693   /// Retrieve the template argument list as written in the sources,
   2694   /// if any.
   2695   ///
   2696   /// If this function declaration is not a function template specialization
   2697   /// or if it had no explicit template argument list, returns NULL.
   2698   /// Note that it an explicit template argument list may be written empty,
   2699   /// e.g., template<> void foo<>(char* s);
   2700   const ASTTemplateArgumentListInfo*
   2701   getTemplateSpecializationArgsAsWritten() const;
   2702 
   2703   /// Specify that this function declaration is actually a function
   2704   /// template specialization.
   2705   ///
   2706   /// \param Template the function template that this function template
   2707   /// specialization specializes.
   2708   ///
   2709   /// \param TemplateArgs the template arguments that produced this
   2710   /// function template specialization from the template.
   2711   ///
   2712   /// \param InsertPos If non-NULL, the position in the function template
   2713   /// specialization set where the function template specialization data will
   2714   /// be inserted.
   2715   ///
   2716   /// \param TSK the kind of template specialization this is.
   2717   ///
   2718   /// \param TemplateArgsAsWritten location info of template arguments.
   2719   ///
   2720   /// \param PointOfInstantiation point at which the function template
   2721   /// specialization was first instantiated.
   2722   void setFunctionTemplateSpecialization(FunctionTemplateDecl *Template,
   2723                 const TemplateArgumentList *TemplateArgs,
   2724                 void *InsertPos,
   2725                 TemplateSpecializationKind TSK = TSK_ImplicitInstantiation,
   2726                 const TemplateArgumentListInfo *TemplateArgsAsWritten = nullptr,
   2727                 SourceLocation PointOfInstantiation = SourceLocation()) {
   2728     setFunctionTemplateSpecialization(getASTContext(), Template, TemplateArgs,
   2729                                       InsertPos, TSK, TemplateArgsAsWritten,
   2730                                       PointOfInstantiation);
   2731   }
   2732 
   2733   /// Specifies that this function declaration is actually a
   2734   /// dependent function template specialization.
   2735   void setDependentTemplateSpecialization(ASTContext &Context,
   2736                              const UnresolvedSetImpl &Templates,
   2737                       const TemplateArgumentListInfo &TemplateArgs);
   2738 
   2739   DependentFunctionTemplateSpecializationInfo *
   2740   getDependentSpecializationInfo() const;
   2741 
   2742   /// Determine what kind of template instantiation this function
   2743   /// represents.
   2744   TemplateSpecializationKind getTemplateSpecializationKind() const;
   2745 
   2746   /// Determine the kind of template specialization this function represents
   2747   /// for the purpose of template instantiation.
   2748   TemplateSpecializationKind
   2749   getTemplateSpecializationKindForInstantiation() const;
   2750 
   2751   /// Determine what kind of template instantiation this function
   2752   /// represents.
   2753   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   2754                         SourceLocation PointOfInstantiation = SourceLocation());
   2755 
   2756   /// Retrieve the (first) point of instantiation of a function template
   2757   /// specialization or a member of a class template specialization.
   2758   ///
   2759   /// \returns the first point of instantiation, if this function was
   2760   /// instantiated from a template; otherwise, returns an invalid source
   2761   /// location.
   2762   SourceLocation getPointOfInstantiation() const;
   2763 
   2764   /// Determine whether this is or was instantiated from an out-of-line
   2765   /// definition of a member function.
   2766   bool isOutOfLine() const override;
   2767 
   2768   /// Identify a memory copying or setting function.
   2769   /// If the given function is a memory copy or setting function, returns
   2770   /// the corresponding Builtin ID. If the function is not a memory function,
   2771   /// returns 0.
   2772   unsigned getMemoryFunctionKind() const;
   2773 
   2774   /// Returns ODRHash of the function.  This value is calculated and
   2775   /// stored on first call, then the stored value returned on the other calls.
   2776   unsigned getODRHash();
   2777 
   2778   /// Returns cached ODRHash of the function.  This must have been previously
   2779   /// computed and stored.
   2780   unsigned getODRHash() const;
   2781 
   2782   // Implement isa/cast/dyncast/etc.
   2783   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2784   static bool classofKind(Kind K) {
   2785     return K >= firstFunction && K <= lastFunction;
   2786   }
   2787   static DeclContext *castToDeclContext(const FunctionDecl *D) {
   2788     return static_cast<DeclContext *>(const_cast<FunctionDecl*>(D));
   2789   }
   2790   static FunctionDecl *castFromDeclContext(const DeclContext *DC) {
   2791     return static_cast<FunctionDecl *>(const_cast<DeclContext*>(DC));
   2792   }
   2793 };
   2794 
   2795 /// Represents a member of a struct/union/class.
   2796 class FieldDecl : public DeclaratorDecl, public Mergeable<FieldDecl> {
   2797   unsigned BitField : 1;
   2798   unsigned Mutable : 1;
   2799   mutable unsigned CachedFieldIndex : 30;
   2800 
   2801   /// The kinds of value we can store in InitializerOrBitWidth.
   2802   ///
   2803   /// Note that this is compatible with InClassInitStyle except for
   2804   /// ISK_CapturedVLAType.
   2805   enum InitStorageKind {
   2806     /// If the pointer is null, there's nothing special.  Otherwise,
   2807     /// this is a bitfield and the pointer is the Expr* storing the
   2808     /// bit-width.
   2809     ISK_NoInit = (unsigned) ICIS_NoInit,
   2810 
   2811     /// The pointer is an (optional due to delayed parsing) Expr*
   2812     /// holding the copy-initializer.
   2813     ISK_InClassCopyInit = (unsigned) ICIS_CopyInit,
   2814 
   2815     /// The pointer is an (optional due to delayed parsing) Expr*
   2816     /// holding the list-initializer.
   2817     ISK_InClassListInit = (unsigned) ICIS_ListInit,
   2818 
   2819     /// The pointer is a VariableArrayType* that's been captured;
   2820     /// the enclosing context is a lambda or captured statement.
   2821     ISK_CapturedVLAType,
   2822   };
   2823 
   2824   /// If this is a bitfield with a default member initializer, this
   2825   /// structure is used to represent the two expressions.
   2826   struct InitAndBitWidth {
   2827     Expr *Init;
   2828     Expr *BitWidth;
   2829   };
   2830 
   2831   /// Storage for either the bit-width, the in-class initializer, or
   2832   /// both (via InitAndBitWidth), or the captured variable length array bound.
   2833   ///
   2834   /// If the storage kind is ISK_InClassCopyInit or
   2835   /// ISK_InClassListInit, but the initializer is null, then this
   2836   /// field has an in-class initializer that has not yet been parsed
   2837   /// and attached.
   2838   // FIXME: Tail-allocate this to reduce the size of FieldDecl in the
   2839   // overwhelmingly common case that we have none of these things.
   2840   llvm::PointerIntPair<void *, 2, InitStorageKind> InitStorage;
   2841 
   2842 protected:
   2843   FieldDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
   2844             SourceLocation IdLoc, IdentifierInfo *Id,
   2845             QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
   2846             InClassInitStyle InitStyle)
   2847     : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc),
   2848       BitField(false), Mutable(Mutable), CachedFieldIndex(0),
   2849       InitStorage(nullptr, (InitStorageKind) InitStyle) {
   2850     if (BW)
   2851       setBitWidth(BW);
   2852   }
   2853 
   2854 public:
   2855   friend class ASTDeclReader;
   2856   friend class ASTDeclWriter;
   2857 
   2858   static FieldDecl *Create(const ASTContext &C, DeclContext *DC,
   2859                            SourceLocation StartLoc, SourceLocation IdLoc,
   2860                            IdentifierInfo *Id, QualType T,
   2861                            TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
   2862                            InClassInitStyle InitStyle);
   2863 
   2864   static FieldDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   2865 
   2866   /// Returns the index of this field within its record,
   2867   /// as appropriate for passing to ASTRecordLayout::getFieldOffset.
   2868   unsigned getFieldIndex() const;
   2869 
   2870   /// Determines whether this field is mutable (C++ only).
   2871   bool isMutable() const { return Mutable; }
   2872 
   2873   /// Determines whether this field is a bitfield.
   2874   bool isBitField() const { return BitField; }
   2875 
   2876   /// Determines whether this is an unnamed bitfield.
   2877   bool isUnnamedBitfield() const { return isBitField() && !getDeclName(); }
   2878 
   2879   /// Determines whether this field is a
   2880   /// representative for an anonymous struct or union. Such fields are
   2881   /// unnamed and are implicitly generated by the implementation to
   2882   /// store the data for the anonymous union or struct.
   2883   bool isAnonymousStructOrUnion() const;
   2884 
   2885   Expr *getBitWidth() const {
   2886     if (!BitField)
   2887       return nullptr;
   2888     void *Ptr = InitStorage.getPointer();
   2889     if (getInClassInitStyle())
   2890       return static_cast<InitAndBitWidth*>(Ptr)->BitWidth;
   2891     return static_cast<Expr*>(Ptr);
   2892   }
   2893 
   2894   unsigned getBitWidthValue(const ASTContext &Ctx) const;
   2895 
   2896   /// Set the bit-field width for this member.
   2897   // Note: used by some clients (i.e., do not remove it).
   2898   void setBitWidth(Expr *Width) {
   2899     assert(!hasCapturedVLAType() && !BitField &&
   2900            "bit width or captured type already set");
   2901     assert(Width && "no bit width specified");
   2902     InitStorage.setPointer(
   2903         InitStorage.getInt()
   2904             ? new (getASTContext())
   2905                   InitAndBitWidth{getInClassInitializer(), Width}
   2906             : static_cast<void*>(Width));
   2907     BitField = true;
   2908   }
   2909 
   2910   /// Remove the bit-field width from this member.
   2911   // Note: used by some clients (i.e., do not remove it).
   2912   void removeBitWidth() {
   2913     assert(isBitField() && "no bitfield width to remove");
   2914     InitStorage.setPointer(getInClassInitializer());
   2915     BitField = false;
   2916   }
   2917 
   2918   /// Is this a zero-length bit-field? Such bit-fields aren't really bit-fields
   2919   /// at all and instead act as a separator between contiguous runs of other
   2920   /// bit-fields.
   2921   bool isZeroLengthBitField(const ASTContext &Ctx) const;
   2922 
   2923   /// Determine if this field is a subobject of zero size, that is, either a
   2924   /// zero-length bit-field or a field of empty class type with the
   2925   /// [[no_unique_address]] attribute.
   2926   bool isZeroSize(const ASTContext &Ctx) const;
   2927 
   2928   /// Get the kind of (C++11) default member initializer that this field has.
   2929   InClassInitStyle getInClassInitStyle() const {
   2930     InitStorageKind storageKind = InitStorage.getInt();
   2931     return (storageKind == ISK_CapturedVLAType
   2932               ? ICIS_NoInit : (InClassInitStyle) storageKind);
   2933   }
   2934 
   2935   /// Determine whether this member has a C++11 default member initializer.
   2936   bool hasInClassInitializer() const {
   2937     return getInClassInitStyle() != ICIS_NoInit;
   2938   }
   2939 
   2940   /// Get the C++11 default member initializer for this member, or null if one
   2941   /// has not been set. If a valid declaration has a default member initializer,
   2942   /// but this returns null, then we have not parsed and attached it yet.
   2943   Expr *getInClassInitializer() const {
   2944     if (!hasInClassInitializer())
   2945       return nullptr;
   2946     void *Ptr = InitStorage.getPointer();
   2947     if (BitField)
   2948       return static_cast<InitAndBitWidth*>(Ptr)->Init;
   2949     return static_cast<Expr*>(Ptr);
   2950   }
   2951 
   2952   /// Set the C++11 in-class initializer for this member.
   2953   void setInClassInitializer(Expr *Init) {
   2954     assert(hasInClassInitializer() && !getInClassInitializer());
   2955     if (BitField)
   2956       static_cast<InitAndBitWidth*>(InitStorage.getPointer())->Init = Init;
   2957     else
   2958       InitStorage.setPointer(Init);
   2959   }
   2960 
   2961   /// Remove the C++11 in-class initializer from this member.
   2962   void removeInClassInitializer() {
   2963     assert(hasInClassInitializer() && "no initializer to remove");
   2964     InitStorage.setPointerAndInt(getBitWidth(), ISK_NoInit);
   2965   }
   2966 
   2967   /// Determine whether this member captures the variable length array
   2968   /// type.
   2969   bool hasCapturedVLAType() const {
   2970     return InitStorage.getInt() == ISK_CapturedVLAType;
   2971   }
   2972 
   2973   /// Get the captured variable length array type.
   2974   const VariableArrayType *getCapturedVLAType() const {
   2975     return hasCapturedVLAType() ? static_cast<const VariableArrayType *>(
   2976                                       InitStorage.getPointer())
   2977                                 : nullptr;
   2978   }
   2979 
   2980   /// Set the captured variable length array type for this field.
   2981   void setCapturedVLAType(const VariableArrayType *VLAType);
   2982 
   2983   /// Returns the parent of this field declaration, which
   2984   /// is the struct in which this field is defined.
   2985   ///
   2986   /// Returns null if this is not a normal class/struct field declaration, e.g.
   2987   /// ObjCAtDefsFieldDecl, ObjCIvarDecl.
   2988   const RecordDecl *getParent() const {
   2989     return dyn_cast<RecordDecl>(getDeclContext());
   2990   }
   2991 
   2992   RecordDecl *getParent() {
   2993     return dyn_cast<RecordDecl>(getDeclContext());
   2994   }
   2995 
   2996   SourceRange getSourceRange() const override LLVM_READONLY;
   2997 
   2998   /// Retrieves the canonical declaration of this field.
   2999   FieldDecl *getCanonicalDecl() override { return getFirstDecl(); }
   3000   const FieldDecl *getCanonicalDecl() const { return getFirstDecl(); }
   3001 
   3002   // Implement isa/cast/dyncast/etc.
   3003   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3004   static bool classofKind(Kind K) { return K >= firstField && K <= lastField; }
   3005 };
   3006 
   3007 /// An instance of this object exists for each enum constant
   3008 /// that is defined.  For example, in "enum X {a,b}", each of a/b are
   3009 /// EnumConstantDecl's, X is an instance of EnumDecl, and the type of a/b is a
   3010 /// TagType for the X EnumDecl.
   3011 class EnumConstantDecl : public ValueDecl, public Mergeable<EnumConstantDecl> {
   3012   Stmt *Init; // an integer constant expression
   3013   llvm::APSInt Val; // The value.
   3014 
   3015 protected:
   3016   EnumConstantDecl(DeclContext *DC, SourceLocation L,
   3017                    IdentifierInfo *Id, QualType T, Expr *E,
   3018                    const llvm::APSInt &V)
   3019     : ValueDecl(EnumConstant, DC, L, Id, T), Init((Stmt*)E), Val(V) {}
   3020 
   3021 public:
   3022   friend class StmtIteratorBase;
   3023 
   3024   static EnumConstantDecl *Create(ASTContext &C, EnumDecl *DC,
   3025                                   SourceLocation L, IdentifierInfo *Id,
   3026                                   QualType T, Expr *E,
   3027                                   const llvm::APSInt &V);
   3028   static EnumConstantDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   3029 
   3030   const Expr *getInitExpr() const { return (const Expr*) Init; }
   3031   Expr *getInitExpr() { return (Expr*) Init; }
   3032   const llvm::APSInt &getInitVal() const { return Val; }
   3033 
   3034   void setInitExpr(Expr *E) { Init = (Stmt*) E; }
   3035   void setInitVal(const llvm::APSInt &V) { Val = V; }
   3036 
   3037   SourceRange getSourceRange() const override LLVM_READONLY;
   3038 
   3039   /// Retrieves the canonical declaration of this enumerator.
   3040   EnumConstantDecl *getCanonicalDecl() override { return getFirstDecl(); }
   3041   const EnumConstantDecl *getCanonicalDecl() const { return getFirstDecl(); }
   3042 
   3043   // Implement isa/cast/dyncast/etc.
   3044   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3045   static bool classofKind(Kind K) { return K == EnumConstant; }
   3046 };
   3047 
   3048 /// Represents a field injected from an anonymous union/struct into the parent
   3049 /// scope. These are always implicit.
   3050 class IndirectFieldDecl : public ValueDecl,
   3051                           public Mergeable<IndirectFieldDecl> {
   3052   NamedDecl **Chaining;
   3053   unsigned ChainingSize;
   3054 
   3055   IndirectFieldDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
   3056                     DeclarationName N, QualType T,
   3057                     MutableArrayRef<NamedDecl *> CH);
   3058 
   3059   void anchor() override;
   3060 
   3061 public:
   3062   friend class ASTDeclReader;
   3063 
   3064   static IndirectFieldDecl *Create(ASTContext &C, DeclContext *DC,
   3065                                    SourceLocation L, IdentifierInfo *Id,
   3066                                    QualType T, llvm::MutableArrayRef<NamedDecl *> CH);
   3067 
   3068   static IndirectFieldDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   3069 
   3070   using chain_iterator = ArrayRef<NamedDecl *>::const_iterator;
   3071 
   3072   ArrayRef<NamedDecl *> chain() const {
   3073     return llvm::makeArrayRef(Chaining, ChainingSize);
   3074   }
   3075   chain_iterator chain_begin() const { return chain().begin(); }
   3076   chain_iterator chain_end() const { return chain().end(); }
   3077 
   3078   unsigned getChainingSize() const { return ChainingSize; }
   3079 
   3080   FieldDecl *getAnonField() const {
   3081     assert(chain().size() >= 2);
   3082     return cast<FieldDecl>(chain().back());
   3083   }
   3084 
   3085   VarDecl *getVarDecl() const {
   3086     assert(chain().size() >= 2);
   3087     return dyn_cast<VarDecl>(chain().front());
   3088   }
   3089 
   3090   IndirectFieldDecl *getCanonicalDecl() override { return getFirstDecl(); }
   3091   const IndirectFieldDecl *getCanonicalDecl() const { return getFirstDecl(); }
   3092 
   3093   // Implement isa/cast/dyncast/etc.
   3094   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3095   static bool classofKind(Kind K) { return K == IndirectField; }
   3096 };
   3097 
   3098 /// Represents a declaration of a type.
   3099 class TypeDecl : public NamedDecl {
   3100   friend class ASTContext;
   3101 
   3102   /// This indicates the Type object that represents
   3103   /// this TypeDecl.  It is a cache maintained by
   3104   /// ASTContext::getTypedefType, ASTContext::getTagDeclType, and
   3105   /// ASTContext::getTemplateTypeParmType, and TemplateTypeParmDecl.
   3106   mutable const Type *TypeForDecl = nullptr;
   3107 
   3108   /// The start of the source range for this declaration.
   3109   SourceLocation LocStart;
   3110 
   3111   void anchor() override;
   3112 
   3113 protected:
   3114   TypeDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
   3115            SourceLocation StartL = SourceLocation())
   3116     : NamedDecl(DK, DC, L, Id), LocStart(StartL) {}
   3117 
   3118 public:
   3119   // Low-level accessor. If you just want the type defined by this node,
   3120   // check out ASTContext::getTypeDeclType or one of
   3121   // ASTContext::getTypedefType, ASTContext::getRecordType, etc. if you
   3122   // already know the specific kind of node this is.
   3123   const Type *getTypeForDecl() const { return TypeForDecl; }
   3124   void setTypeForDecl(const Type *TD) { TypeForDecl = TD; }
   3125 
   3126   SourceLocation getBeginLoc() const LLVM_READONLY { return LocStart; }
   3127   void setLocStart(SourceLocation L) { LocStart = L; }
   3128   SourceRange getSourceRange() const override LLVM_READONLY {
   3129     if (LocStart.isValid())
   3130       return SourceRange(LocStart, getLocation());
   3131     else
   3132       return SourceRange(getLocation());
   3133   }
   3134 
   3135   // Implement isa/cast/dyncast/etc.
   3136   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3137   static bool classofKind(Kind K) { return K >= firstType && K <= lastType; }
   3138 };
   3139 
   3140 /// Base class for declarations which introduce a typedef-name.
   3141 class TypedefNameDecl : public TypeDecl, public Redeclarable<TypedefNameDecl> {
   3142   struct alignas(8) ModedTInfo {
   3143     TypeSourceInfo *first;
   3144     QualType second;
   3145   };
   3146 
   3147   /// If int part is 0, we have not computed IsTransparentTag.
   3148   /// Otherwise, IsTransparentTag is (getInt() >> 1).
   3149   mutable llvm::PointerIntPair<
   3150       llvm::PointerUnion<TypeSourceInfo *, ModedTInfo *>, 2>
   3151       MaybeModedTInfo;
   3152 
   3153   void anchor() override;
   3154 
   3155 protected:
   3156   TypedefNameDecl(Kind DK, ASTContext &C, DeclContext *DC,
   3157                   SourceLocation StartLoc, SourceLocation IdLoc,
   3158                   IdentifierInfo *Id, TypeSourceInfo *TInfo)
   3159       : TypeDecl(DK, DC, IdLoc, Id, StartLoc), redeclarable_base(C),
   3160         MaybeModedTInfo(TInfo, 0) {}
   3161 
   3162   using redeclarable_base = Redeclarable<TypedefNameDecl>;
   3163 
   3164   TypedefNameDecl *getNextRedeclarationImpl() override {
   3165     return getNextRedeclaration();
   3166   }
   3167 
   3168   TypedefNameDecl *getPreviousDeclImpl() override {
   3169     return getPreviousDecl();
   3170   }
   3171 
   3172   TypedefNameDecl *getMostRecentDeclImpl() override {
   3173     return getMostRecentDecl();
   3174   }
   3175 
   3176 public:
   3177   using redecl_range = redeclarable_base::redecl_range;
   3178   using redecl_iterator = redeclarable_base::redecl_iterator;
   3179 
   3180   using redeclarable_base::redecls_begin;
   3181   using redeclarable_base::redecls_end;
   3182   using redeclarable_base::redecls;
   3183   using redeclarable_base::getPreviousDecl;
   3184   using redeclarable_base::getMostRecentDecl;
   3185   using redeclarable_base::isFirstDecl;
   3186 
   3187   bool isModed() const {
   3188     return MaybeModedTInfo.getPointer().is<ModedTInfo *>();
   3189   }
   3190 
   3191   TypeSourceInfo *getTypeSourceInfo() const {
   3192     return isModed() ? MaybeModedTInfo.getPointer().get<ModedTInfo *>()->first
   3193                      : MaybeModedTInfo.getPointer().get<TypeSourceInfo *>();
   3194   }
   3195 
   3196   QualType getUnderlyingType() const {
   3197     return isModed() ? MaybeModedTInfo.getPointer().get<ModedTInfo *>()->second
   3198                      : MaybeModedTInfo.getPointer()
   3199                            .get<TypeSourceInfo *>()
   3200                            ->getType();
   3201   }
   3202 
   3203   void setTypeSourceInfo(TypeSourceInfo *newType) {
   3204     MaybeModedTInfo.setPointer(newType);
   3205   }
   3206 
   3207   void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy) {
   3208     MaybeModedTInfo.setPointer(new (getASTContext(), 8)
   3209                                    ModedTInfo({unmodedTSI, modedTy}));
   3210   }
   3211 
   3212   /// Retrieves the canonical declaration of this typedef-name.
   3213   TypedefNameDecl *getCanonicalDecl() override { return getFirstDecl(); }
   3214   const TypedefNameDecl *getCanonicalDecl() const { return getFirstDecl(); }
   3215 
   3216   /// Retrieves the tag declaration for which this is the typedef name for
   3217   /// linkage purposes, if any.
   3218   ///
   3219   /// \param AnyRedecl Look for the tag declaration in any redeclaration of
   3220   /// this typedef declaration.
   3221   TagDecl *getAnonDeclWithTypedefName(bool AnyRedecl = false) const;
   3222 
   3223   /// Determines if this typedef shares a name and spelling location with its
   3224   /// underlying tag type, as is the case with the NS_ENUM macro.
   3225   bool isTransparentTag() const {
   3226     if (MaybeModedTInfo.getInt())
   3227       return MaybeModedTInfo.getInt() & 0x2;
   3228     return isTransparentTagSlow();
   3229   }
   3230 
   3231   // Implement isa/cast/dyncast/etc.
   3232   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3233   static bool classofKind(Kind K) {
   3234     return K >= firstTypedefName && K <= lastTypedefName;
   3235   }
   3236 
   3237 private:
   3238   bool isTransparentTagSlow() const;
   3239 };
   3240 
   3241 /// Represents the declaration of a typedef-name via the 'typedef'
   3242 /// type specifier.
   3243 class TypedefDecl : public TypedefNameDecl {
   3244   TypedefDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   3245               SourceLocation IdLoc, IdentifierInfo *Id, TypeSourceInfo *TInfo)
   3246       : TypedefNameDecl(Typedef, C, DC, StartLoc, IdLoc, Id, TInfo) {}
   3247 
   3248 public:
   3249   static TypedefDecl *Create(ASTContext &C, DeclContext *DC,
   3250                              SourceLocation StartLoc, SourceLocation IdLoc,
   3251                              IdentifierInfo *Id, TypeSourceInfo *TInfo);
   3252   static TypedefDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   3253 
   3254   SourceRange getSourceRange() const override LLVM_READONLY;
   3255 
   3256   // Implement isa/cast/dyncast/etc.
   3257   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3258   static bool classofKind(Kind K) { return K == Typedef; }
   3259 };
   3260 
   3261 /// Represents the declaration of a typedef-name via a C++11
   3262 /// alias-declaration.
   3263 class TypeAliasDecl : public TypedefNameDecl {
   3264   /// The template for which this is the pattern, if any.
   3265   TypeAliasTemplateDecl *Template;
   3266 
   3267   TypeAliasDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   3268                 SourceLocation IdLoc, IdentifierInfo *Id, TypeSourceInfo *TInfo)
   3269       : TypedefNameDecl(TypeAlias, C, DC, StartLoc, IdLoc, Id, TInfo),
   3270         Template(nullptr) {}
   3271 
   3272 public:
   3273   static TypeAliasDecl *Create(ASTContext &C, DeclContext *DC,
   3274                                SourceLocation StartLoc, SourceLocation IdLoc,
   3275                                IdentifierInfo *Id, TypeSourceInfo *TInfo);
   3276   static TypeAliasDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   3277 
   3278   SourceRange getSourceRange() const override LLVM_READONLY;
   3279 
   3280   TypeAliasTemplateDecl *getDescribedAliasTemplate() const { return Template; }
   3281   void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT) { Template = TAT; }
   3282 
   3283   // Implement isa/cast/dyncast/etc.
   3284   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3285   static bool classofKind(Kind K) { return K == TypeAlias; }
   3286 };
   3287 
   3288 /// Represents the declaration of a struct/union/class/enum.
   3289 class TagDecl : public TypeDecl,
   3290                 public DeclContext,
   3291                 public Redeclarable<TagDecl> {
   3292   // This class stores some data in DeclContext::TagDeclBits
   3293   // to save some space. Use the provided accessors to access it.
   3294 public:
   3295   // This is really ugly.
   3296   using TagKind = TagTypeKind;
   3297 
   3298 private:
   3299   SourceRange BraceRange;
   3300 
   3301   // A struct representing syntactic qualifier info,
   3302   // to be used for the (uncommon) case of out-of-line declarations.
   3303   using ExtInfo = QualifierInfo;
   3304 
   3305   /// If the (out-of-line) tag declaration name
   3306   /// is qualified, it points to the qualifier info (nns and range);
   3307   /// otherwise, if the tag declaration is anonymous and it is part of
   3308   /// a typedef or alias, it points to the TypedefNameDecl (used for mangling);
   3309   /// otherwise, if the tag declaration is anonymous and it is used as a
   3310   /// declaration specifier for variables, it points to the first VarDecl (used
   3311   /// for mangling);
   3312   /// otherwise, it is a null (TypedefNameDecl) pointer.
   3313   llvm::PointerUnion<TypedefNameDecl *, ExtInfo *> TypedefNameDeclOrQualifier;
   3314 
   3315   bool hasExtInfo() const { return TypedefNameDeclOrQualifier.is<ExtInfo *>(); }
   3316   ExtInfo *getExtInfo() { return TypedefNameDeclOrQualifier.get<ExtInfo *>(); }
   3317   const ExtInfo *getExtInfo() const {
   3318     return TypedefNameDeclOrQualifier.get<ExtInfo *>();
   3319   }
   3320 
   3321 protected:
   3322   TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC,
   3323           SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl,
   3324           SourceLocation StartL);
   3325 
   3326   using redeclarable_base = Redeclarable<TagDecl>;
   3327 
   3328   TagDecl *getNextRedeclarationImpl() override {
   3329     return getNextRedeclaration();
   3330   }
   3331 
   3332   TagDecl *getPreviousDeclImpl() override {
   3333     return getPreviousDecl();
   3334   }
   3335 
   3336   TagDecl *getMostRecentDeclImpl() override {
   3337     return getMostRecentDecl();
   3338   }
   3339 
   3340   /// Completes the definition of this tag declaration.
   3341   ///
   3342   /// This is a helper function for derived classes.
   3343   void completeDefinition();
   3344 
   3345   /// True if this decl is currently being defined.
   3346   void setBeingDefined(bool V = true) { TagDeclBits.IsBeingDefined = V; }
   3347 
   3348   /// Indicates whether it is possible for declarations of this kind
   3349   /// to have an out-of-date definition.
   3350   ///
   3351   /// This option is only enabled when modules are enabled.
   3352   void setMayHaveOutOfDateDef(bool V = true) {
   3353     TagDeclBits.MayHaveOutOfDateDef = V;
   3354   }
   3355 
   3356 public:
   3357   friend class ASTDeclReader;
   3358   friend class ASTDeclWriter;
   3359 
   3360   using redecl_range = redeclarable_base::redecl_range;
   3361   using redecl_iterator = redeclarable_base::redecl_iterator;
   3362 
   3363   using redeclarable_base::redecls_begin;
   3364   using redeclarable_base::redecls_end;
   3365   using redeclarable_base::redecls;
   3366   using redeclarable_base::getPreviousDecl;
   3367   using redeclarable_base::getMostRecentDecl;
   3368   using redeclarable_base::isFirstDecl;
   3369 
   3370   SourceRange getBraceRange() const { return BraceRange; }
   3371   void setBraceRange(SourceRange R) { BraceRange = R; }
   3372 
   3373   /// Return SourceLocation representing start of source
   3374   /// range ignoring outer template declarations.
   3375   SourceLocation getInnerLocStart() const { return getBeginLoc(); }
   3376 
   3377   /// Return SourceLocation representing start of source
   3378   /// range taking into account any outer template declarations.
   3379   SourceLocation getOuterLocStart() const;
   3380   SourceRange getSourceRange() const override LLVM_READONLY;
   3381 
   3382   TagDecl *getCanonicalDecl() override;
   3383   const TagDecl *getCanonicalDecl() const {
   3384     return const_cast<TagDecl*>(this)->getCanonicalDecl();
   3385   }
   3386 
   3387   /// Return true if this declaration is a completion definition of the type.
   3388   /// Provided for consistency.
   3389   bool isThisDeclarationADefinition() const {
   3390     return isCompleteDefinition();
   3391   }
   3392 
   3393   /// Return true if this decl has its body fully specified.
   3394   bool isCompleteDefinition() const { return TagDeclBits.IsCompleteDefinition; }
   3395 
   3396   /// True if this decl has its body fully specified.
   3397   void setCompleteDefinition(bool V = true) {
   3398     TagDeclBits.IsCompleteDefinition = V;
   3399   }
   3400 
   3401   /// Return true if this complete decl is
   3402   /// required to be complete for some existing use.
   3403   bool isCompleteDefinitionRequired() const {
   3404     return TagDeclBits.IsCompleteDefinitionRequired;
   3405   }
   3406 
   3407   /// True if this complete decl is
   3408   /// required to be complete for some existing use.
   3409   void setCompleteDefinitionRequired(bool V = true) {
   3410     TagDeclBits.IsCompleteDefinitionRequired = V;
   3411   }
   3412 
   3413   /// Return true if this decl is currently being defined.
   3414   bool isBeingDefined() const { return TagDeclBits.IsBeingDefined; }
   3415 
   3416   /// True if this tag declaration is "embedded" (i.e., defined or declared
   3417   /// for the very first time) in the syntax of a declarator.
   3418   bool isEmbeddedInDeclarator() const {
   3419     return TagDeclBits.IsEmbeddedInDeclarator;
   3420   }
   3421 
   3422   /// True if this tag declaration is "embedded" (i.e., defined or declared
   3423   /// for the very first time) in the syntax of a declarator.
   3424   void setEmbeddedInDeclarator(bool isInDeclarator) {
   3425     TagDeclBits.IsEmbeddedInDeclarator = isInDeclarator;
   3426   }
   3427 
   3428   /// True if this tag is free standing, e.g. "struct foo;".
   3429   bool isFreeStanding() const { return TagDeclBits.IsFreeStanding; }
   3430 
   3431   /// True if this tag is free standing, e.g. "struct foo;".
   3432   void setFreeStanding(bool isFreeStanding = true) {
   3433     TagDeclBits.IsFreeStanding = isFreeStanding;
   3434   }
   3435 
   3436   /// Indicates whether it is possible for declarations of this kind
   3437   /// to have an out-of-date definition.
   3438   ///
   3439   /// This option is only enabled when modules are enabled.
   3440   bool mayHaveOutOfDateDef() const { return TagDeclBits.MayHaveOutOfDateDef; }
   3441 
   3442   /// Whether this declaration declares a type that is
   3443   /// dependent, i.e., a type that somehow depends on template
   3444   /// parameters.
   3445   bool isDependentType() const { return isDependentContext(); }
   3446 
   3447   /// Starts the definition of this tag declaration.
   3448   ///
   3449   /// This method should be invoked at the beginning of the definition
   3450   /// of this tag declaration. It will set the tag type into a state
   3451   /// where it is in the process of being defined.
   3452   void startDefinition();
   3453 
   3454   /// Returns the TagDecl that actually defines this
   3455   ///  struct/union/class/enum.  When determining whether or not a
   3456   ///  struct/union/class/enum has a definition, one should use this
   3457   ///  method as opposed to 'isDefinition'.  'isDefinition' indicates
   3458   ///  whether or not a specific TagDecl is defining declaration, not
   3459   ///  whether or not the struct/union/class/enum type is defined.
   3460   ///  This method returns NULL if there is no TagDecl that defines
   3461   ///  the struct/union/class/enum.
   3462   TagDecl *getDefinition() const;
   3463 
   3464   StringRef getKindName() const {
   3465     return TypeWithKeyword::getTagTypeKindName(getTagKind());
   3466   }
   3467 
   3468   TagKind getTagKind() const {
   3469     return static_cast<TagKind>(TagDeclBits.TagDeclKind);
   3470   }
   3471 
   3472   void setTagKind(TagKind TK) { TagDeclBits.TagDeclKind = TK; }
   3473 
   3474   bool isStruct() const { return getTagKind() == TTK_Struct; }
   3475   bool isInterface() const { return getTagKind() == TTK_Interface; }
   3476   bool isClass()  const { return getTagKind() == TTK_Class; }
   3477   bool isUnion()  const { return getTagKind() == TTK_Union; }
   3478   bool isEnum()   const { return getTagKind() == TTK_Enum; }
   3479 
   3480   /// Is this tag type named, either directly or via being defined in
   3481   /// a typedef of this type?
   3482   ///
   3483   /// C++11 [basic.link]p8:
   3484   ///   A type is said to have linkage if and only if:
   3485   ///     - it is a class or enumeration type that is named (or has a
   3486   ///       name for linkage purposes) and the name has linkage; ...
   3487   /// C++11 [dcl.typedef]p9:
   3488   ///   If the typedef declaration defines an unnamed class (or enum),
   3489   ///   the first typedef-name declared by the declaration to be that
   3490   ///   class type (or enum type) is used to denote the class type (or
   3491   ///   enum type) for linkage purposes only.
   3492   ///
   3493   /// C does not have an analogous rule, but the same concept is
   3494   /// nonetheless useful in some places.
   3495   bool hasNameForLinkage() const {
   3496     return (getDeclName() || getTypedefNameForAnonDecl());
   3497   }
   3498 
   3499   TypedefNameDecl *getTypedefNameForAnonDecl() const {
   3500     return hasExtInfo() ? nullptr
   3501                         : TypedefNameDeclOrQualifier.get<TypedefNameDecl *>();
   3502   }
   3503 
   3504   void setTypedefNameForAnonDecl(TypedefNameDecl *TDD);
   3505 
   3506   /// Retrieve the nested-name-specifier that qualifies the name of this
   3507   /// declaration, if it was present in the source.
   3508   NestedNameSpecifier *getQualifier() const {
   3509     return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
   3510                         : nullptr;
   3511   }
   3512 
   3513   /// Retrieve the nested-name-specifier (with source-location
   3514   /// information) that qualifies the name of this declaration, if it was
   3515   /// present in the source.
   3516   NestedNameSpecifierLoc getQualifierLoc() const {
   3517     return hasExtInfo() ? getExtInfo()->QualifierLoc
   3518                         : NestedNameSpecifierLoc();
   3519   }
   3520 
   3521   void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc);
   3522 
   3523   unsigned getNumTemplateParameterLists() const {
   3524     return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
   3525   }
   3526 
   3527   TemplateParameterList *getTemplateParameterList(unsigned i) const {
   3528     assert(i < getNumTemplateParameterLists());
   3529     return getExtInfo()->TemplParamLists[i];
   3530   }
   3531 
   3532   void setTemplateParameterListsInfo(ASTContext &Context,
   3533                                      ArrayRef<TemplateParameterList *> TPLists);
   3534 
   3535   // Implement isa/cast/dyncast/etc.
   3536   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3537   static bool classofKind(Kind K) { return K >= firstTag && K <= lastTag; }
   3538 
   3539   static DeclContext *castToDeclContext(const TagDecl *D) {
   3540     return static_cast<DeclContext *>(const_cast<TagDecl*>(D));
   3541   }
   3542 
   3543   static TagDecl *castFromDeclContext(const DeclContext *DC) {
   3544     return static_cast<TagDecl *>(const_cast<DeclContext*>(DC));
   3545   }
   3546 };
   3547 
   3548 /// Represents an enum.  In C++11, enums can be forward-declared
   3549 /// with a fixed underlying type, and in C we allow them to be forward-declared
   3550 /// with no underlying type as an extension.
   3551 class EnumDecl : public TagDecl {
   3552   // This class stores some data in DeclContext::EnumDeclBits
   3553   // to save some space. Use the provided accessors to access it.
   3554 
   3555   /// This represent the integer type that the enum corresponds
   3556   /// to for code generation purposes.  Note that the enumerator constants may
   3557   /// have a different type than this does.
   3558   ///
   3559   /// If the underlying integer type was explicitly stated in the source
   3560   /// code, this is a TypeSourceInfo* for that type. Otherwise this type
   3561   /// was automatically deduced somehow, and this is a Type*.
   3562   ///
   3563   /// Normally if IsFixed(), this would contain a TypeSourceInfo*, but in
   3564   /// some cases it won't.
   3565   ///
   3566   /// The underlying type of an enumeration never has any qualifiers, so
   3567   /// we can get away with just storing a raw Type*, and thus save an
   3568   /// extra pointer when TypeSourceInfo is needed.
   3569   llvm::PointerUnion<const Type *, TypeSourceInfo *> IntegerType;
   3570 
   3571   /// The integer type that values of this type should
   3572   /// promote to.  In C, enumerators are generally of an integer type
   3573   /// directly, but gcc-style large enumerators (and all enumerators
   3574   /// in C++) are of the enum type instead.
   3575   QualType PromotionType;
   3576 
   3577   /// If this enumeration is an instantiation of a member enumeration
   3578   /// of a class template specialization, this is the member specialization
   3579   /// information.
   3580   MemberSpecializationInfo *SpecializationInfo = nullptr;
   3581 
   3582   /// Store the ODRHash after first calculation.
   3583   /// The corresponding flag HasODRHash is in EnumDeclBits
   3584   /// and can be accessed with the provided accessors.
   3585   unsigned ODRHash;
   3586 
   3587   EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
   3588            SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl,
   3589            bool Scoped, bool ScopedUsingClassTag, bool Fixed);
   3590 
   3591   void anchor() override;
   3592 
   3593   void setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED,
   3594                                     TemplateSpecializationKind TSK);
   3595 
   3596   /// Sets the width in bits required to store all the
   3597   /// non-negative enumerators of this enum.
   3598   void setNumPositiveBits(unsigned Num) {
   3599     EnumDeclBits.NumPositiveBits = Num;
   3600     assert(EnumDeclBits.NumPositiveBits == Num && "can't store this bitcount");
   3601   }
   3602 
   3603   /// Returns the width in bits required to store all the
   3604   /// negative enumerators of this enum. (see getNumNegativeBits)
   3605   void setNumNegativeBits(unsigned Num) { EnumDeclBits.NumNegativeBits = Num; }
   3606 
   3607 public:
   3608   /// True if this tag declaration is a scoped enumeration. Only
   3609   /// possible in C++11 mode.
   3610   void setScoped(bool Scoped = true) { EnumDeclBits.IsScoped = Scoped; }
   3611 
   3612   /// If this tag declaration is a scoped enum,
   3613   /// then this is true if the scoped enum was declared using the class
   3614   /// tag, false if it was declared with the struct tag. No meaning is
   3615   /// associated if this tag declaration is not a scoped enum.
   3616   void setScopedUsingClassTag(bool ScopedUCT = true) {
   3617     EnumDeclBits.IsScopedUsingClassTag = ScopedUCT;
   3618   }
   3619 
   3620   /// True if this is an Objective-C, C++11, or
   3621   /// Microsoft-style enumeration with a fixed underlying type.
   3622   void setFixed(bool Fixed = true) { EnumDeclBits.IsFixed = Fixed; }
   3623 
   3624 private:
   3625   /// True if a valid hash is stored in ODRHash.
   3626   bool hasODRHash() const { return EnumDeclBits.HasODRHash; }
   3627   void setHasODRHash(bool Hash = true) { EnumDeclBits.HasODRHash = Hash; }
   3628 
   3629 public:
   3630   friend class ASTDeclReader;
   3631 
   3632   EnumDecl *getCanonicalDecl() override {
   3633     return cast<EnumDecl>(TagDecl::getCanonicalDecl());
   3634   }
   3635   const EnumDecl *getCanonicalDecl() const {
   3636     return const_cast<EnumDecl*>(this)->getCanonicalDecl();
   3637   }
   3638 
   3639   EnumDecl *getPreviousDecl() {
   3640     return cast_or_null<EnumDecl>(
   3641             static_cast<TagDecl *>(this)->getPreviousDecl());
   3642   }
   3643   const EnumDecl *getPreviousDecl() const {
   3644     return const_cast<EnumDecl*>(this)->getPreviousDecl();
   3645   }
   3646 
   3647   EnumDecl *getMostRecentDecl() {
   3648     return cast<EnumDecl>(static_cast<TagDecl *>(this)->getMostRecentDecl());
   3649   }
   3650   const EnumDecl *getMostRecentDecl() const {
   3651     return const_cast<EnumDecl*>(this)->getMostRecentDecl();
   3652   }
   3653 
   3654   EnumDecl *getDefinition() const {
   3655     return cast_or_null<EnumDecl>(TagDecl::getDefinition());
   3656   }
   3657 
   3658   static EnumDecl *Create(ASTContext &C, DeclContext *DC,
   3659                           SourceLocation StartLoc, SourceLocation IdLoc,
   3660                           IdentifierInfo *Id, EnumDecl *PrevDecl,
   3661                           bool IsScoped, bool IsScopedUsingClassTag,
   3662                           bool IsFixed);
   3663   static EnumDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   3664 
   3665   /// When created, the EnumDecl corresponds to a
   3666   /// forward-declared enum. This method is used to mark the
   3667   /// declaration as being defined; its enumerators have already been
   3668   /// added (via DeclContext::addDecl). NewType is the new underlying
   3669   /// type of the enumeration type.
   3670   void completeDefinition(QualType NewType,
   3671                           QualType PromotionType,
   3672                           unsigned NumPositiveBits,
   3673                           unsigned NumNegativeBits);
   3674 
   3675   // Iterates through the enumerators of this enumeration.
   3676   using enumerator_iterator = specific_decl_iterator<EnumConstantDecl>;
   3677   using enumerator_range =
   3678       llvm::iterator_range<specific_decl_iterator<EnumConstantDecl>>;
   3679 
   3680   enumerator_range enumerators() const {
   3681     return enumerator_range(enumerator_begin(), enumerator_end());
   3682   }
   3683 
   3684   enumerator_iterator enumerator_begin() const {
   3685     const EnumDecl *E = getDefinition();
   3686     if (!E)
   3687       E = this;
   3688     return enumerator_iterator(E->decls_begin());
   3689   }
   3690 
   3691   enumerator_iterator enumerator_end() const {
   3692     const EnumDecl *E = getDefinition();
   3693     if (!E)
   3694       E = this;
   3695     return enumerator_iterator(E->decls_end());
   3696   }
   3697 
   3698   /// Return the integer type that enumerators should promote to.
   3699   QualType getPromotionType() const { return PromotionType; }
   3700 
   3701   /// Set the promotion type.
   3702   void setPromotionType(QualType T) { PromotionType = T; }
   3703 
   3704   /// Return the integer type this enum decl corresponds to.
   3705   /// This returns a null QualType for an enum forward definition with no fixed
   3706   /// underlying type.
   3707   QualType getIntegerType() const {
   3708     if (!IntegerType)
   3709       return QualType();
   3710     if (const Type *T = IntegerType.dyn_cast<const Type*>())
   3711       return QualType(T, 0);
   3712     return IntegerType.get<TypeSourceInfo*>()->getType().getUnqualifiedType();
   3713   }
   3714 
   3715   /// Set the underlying integer type.
   3716   void setIntegerType(QualType T) { IntegerType = T.getTypePtrOrNull(); }
   3717 
   3718   /// Set the underlying integer type source info.
   3719   void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo) { IntegerType = TInfo; }
   3720 
   3721   /// Return the type source info for the underlying integer type,
   3722   /// if no type source info exists, return 0.
   3723   TypeSourceInfo *getIntegerTypeSourceInfo() const {
   3724     return IntegerType.dyn_cast<TypeSourceInfo*>();
   3725   }
   3726 
   3727   /// Retrieve the source range that covers the underlying type if
   3728   /// specified.
   3729   SourceRange getIntegerTypeRange() const LLVM_READONLY;
   3730 
   3731   /// Returns the width in bits required to store all the
   3732   /// non-negative enumerators of this enum.
   3733   unsigned getNumPositiveBits() const { return EnumDeclBits.NumPositiveBits; }
   3734 
   3735   /// Returns the width in bits required to store all the
   3736   /// negative enumerators of this enum.  These widths include
   3737   /// the rightmost leading 1;  that is:
   3738   ///
   3739   /// MOST NEGATIVE ENUMERATOR     PATTERN     NUM NEGATIVE BITS
   3740   /// ------------------------     -------     -----------------
   3741   ///                       -1     1111111                     1
   3742   ///                      -10     1110110                     5
   3743   ///                     -101     1001011                     8
   3744   unsigned getNumNegativeBits() const { return EnumDeclBits.NumNegativeBits; }
   3745 
   3746   /// Returns true if this is a C++11 scoped enumeration.
   3747   bool isScoped() const { return EnumDeclBits.IsScoped; }
   3748 
   3749   /// Returns true if this is a C++11 scoped enumeration.
   3750   bool isScopedUsingClassTag() const {
   3751     return EnumDeclBits.IsScopedUsingClassTag;
   3752   }
   3753 
   3754   /// Returns true if this is an Objective-C, C++11, or
   3755   /// Microsoft-style enumeration with a fixed underlying type.
   3756   bool isFixed() const { return EnumDeclBits.IsFixed; }
   3757 
   3758   unsigned getODRHash();
   3759 
   3760   /// Returns true if this can be considered a complete type.
   3761   bool isComplete() const {
   3762     // IntegerType is set for fixed type enums and non-fixed but implicitly
   3763     // int-sized Microsoft enums.
   3764     return isCompleteDefinition() || IntegerType;
   3765   }
   3766 
   3767   /// Returns true if this enum is either annotated with
   3768   /// enum_extensibility(closed) or isn't annotated with enum_extensibility.
   3769   bool isClosed() const;
   3770 
   3771   /// Returns true if this enum is annotated with flag_enum and isn't annotated
   3772   /// with enum_extensibility(open).
   3773   bool isClosedFlag() const;
   3774 
   3775   /// Returns true if this enum is annotated with neither flag_enum nor
   3776   /// enum_extensibility(open).
   3777   bool isClosedNonFlag() const;
   3778 
   3779   /// Retrieve the enum definition from which this enumeration could
   3780   /// be instantiated, if it is an instantiation (rather than a non-template).
   3781   EnumDecl *getTemplateInstantiationPattern() const;
   3782 
   3783   /// Returns the enumeration (declared within the template)
   3784   /// from which this enumeration type was instantiated, or NULL if
   3785   /// this enumeration was not instantiated from any template.
   3786   EnumDecl *getInstantiatedFromMemberEnum() const;
   3787 
   3788   /// If this enumeration is a member of a specialization of a
   3789   /// templated class, determine what kind of template specialization
   3790   /// or instantiation this is.
   3791   TemplateSpecializationKind getTemplateSpecializationKind() const;
   3792 
   3793   /// For an enumeration member that was instantiated from a member
   3794   /// enumeration of a templated class, set the template specialiation kind.
   3795   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   3796                         SourceLocation PointOfInstantiation = SourceLocation());
   3797 
   3798   /// If this enumeration is an instantiation of a member enumeration of
   3799   /// a class template specialization, retrieves the member specialization
   3800   /// information.
   3801   MemberSpecializationInfo *getMemberSpecializationInfo() const {
   3802     return SpecializationInfo;
   3803   }
   3804 
   3805   /// Specify that this enumeration is an instantiation of the
   3806   /// member enumeration ED.
   3807   void setInstantiationOfMemberEnum(EnumDecl *ED,
   3808                                     TemplateSpecializationKind TSK) {
   3809     setInstantiationOfMemberEnum(getASTContext(), ED, TSK);
   3810   }
   3811 
   3812   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3813   static bool classofKind(Kind K) { return K == Enum; }
   3814 };
   3815 
   3816 /// Represents a struct/union/class.  For example:
   3817 ///   struct X;                  // Forward declaration, no "body".
   3818 ///   union Y { int A, B; };     // Has body with members A and B (FieldDecls).
   3819 /// This decl will be marked invalid if *any* members are invalid.
   3820 class RecordDecl : public TagDecl {
   3821   // This class stores some data in DeclContext::RecordDeclBits
   3822   // to save some space. Use the provided accessors to access it.
   3823 public:
   3824   friend class DeclContext;
   3825   /// Enum that represents the different ways arguments are passed to and
   3826   /// returned from function calls. This takes into account the target-specific
   3827   /// and version-specific rules along with the rules determined by the
   3828   /// language.
   3829   enum ArgPassingKind : unsigned {
   3830     /// The argument of this type can be passed directly in registers.
   3831     APK_CanPassInRegs,
   3832 
   3833     /// The argument of this type cannot be passed directly in registers.
   3834     /// Records containing this type as a subobject are not forced to be passed
   3835     /// indirectly. This value is used only in C++. This value is required by
   3836     /// C++ because, in uncommon situations, it is possible for a class to have
   3837     /// only trivial copy/move constructors even when one of its subobjects has
   3838     /// a non-trivial copy/move constructor (if e.g. the corresponding copy/move
   3839     /// constructor in the derived class is deleted).
   3840     APK_CannotPassInRegs,
   3841 
   3842     /// The argument of this type cannot be passed directly in registers.
   3843     /// Records containing this type as a subobject are forced to be passed
   3844     /// indirectly.
   3845     APK_CanNeverPassInRegs
   3846   };
   3847 
   3848 protected:
   3849   RecordDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC,
   3850              SourceLocation StartLoc, SourceLocation IdLoc,
   3851              IdentifierInfo *Id, RecordDecl *PrevDecl);
   3852 
   3853 public:
   3854   static RecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
   3855                             SourceLocation StartLoc, SourceLocation IdLoc,
   3856                             IdentifierInfo *Id, RecordDecl* PrevDecl = nullptr);
   3857   static RecordDecl *CreateDeserialized(const ASTContext &C, unsigned ID);
   3858 
   3859   RecordDecl *getPreviousDecl() {
   3860     return cast_or_null<RecordDecl>(
   3861             static_cast<TagDecl *>(this)->getPreviousDecl());
   3862   }
   3863   const RecordDecl *getPreviousDecl() const {
   3864     return const_cast<RecordDecl*>(this)->getPreviousDecl();
   3865   }
   3866 
   3867   RecordDecl *getMostRecentDecl() {
   3868     return cast<RecordDecl>(static_cast<TagDecl *>(this)->getMostRecentDecl());
   3869   }
   3870   const RecordDecl *getMostRecentDecl() const {
   3871     return const_cast<RecordDecl*>(this)->getMostRecentDecl();
   3872   }
   3873 
   3874   bool hasFlexibleArrayMember() const {
   3875     return RecordDeclBits.HasFlexibleArrayMember;
   3876   }
   3877 
   3878   void setHasFlexibleArrayMember(bool V) {
   3879     RecordDeclBits.HasFlexibleArrayMember = V;
   3880   }
   3881 
   3882   /// Whether this is an anonymous struct or union. To be an anonymous
   3883   /// struct or union, it must have been declared without a name and
   3884   /// there must be no objects of this type declared, e.g.,
   3885   /// @code
   3886   ///   union { int i; float f; };
   3887   /// @endcode
   3888   /// is an anonymous union but neither of the following are:
   3889   /// @code
   3890   ///  union X { int i; float f; };
   3891   ///  union { int i; float f; } obj;
   3892   /// @endcode
   3893   bool isAnonymousStructOrUnion() const {
   3894     return RecordDeclBits.AnonymousStructOrUnion;
   3895   }
   3896 
   3897   void setAnonymousStructOrUnion(bool Anon) {
   3898     RecordDeclBits.AnonymousStructOrUnion = Anon;
   3899   }
   3900 
   3901   bool hasObjectMember() const { return RecordDeclBits.HasObjectMember; }
   3902   void setHasObjectMember(bool val) { RecordDeclBits.HasObjectMember = val; }
   3903 
   3904   bool hasVolatileMember() const { return RecordDeclBits.HasVolatileMember; }
   3905 
   3906   void setHasVolatileMember(bool val) {
   3907     RecordDeclBits.HasVolatileMember = val;
   3908   }
   3909 
   3910   bool hasLoadedFieldsFromExternalStorage() const {
   3911     return RecordDeclBits.LoadedFieldsFromExternalStorage;
   3912   }
   3913 
   3914   void setHasLoadedFieldsFromExternalStorage(bool val) const {
   3915     RecordDeclBits.LoadedFieldsFromExternalStorage = val;
   3916   }
   3917 
   3918   /// Functions to query basic properties of non-trivial C structs.
   3919   bool isNonTrivialToPrimitiveDefaultInitialize() const {
   3920     return RecordDeclBits.NonTrivialToPrimitiveDefaultInitialize;
   3921   }
   3922 
   3923   void setNonTrivialToPrimitiveDefaultInitialize(bool V) {
   3924     RecordDeclBits.NonTrivialToPrimitiveDefaultInitialize = V;
   3925   }
   3926 
   3927   bool isNonTrivialToPrimitiveCopy() const {
   3928     return RecordDeclBits.NonTrivialToPrimitiveCopy;
   3929   }
   3930 
   3931   void setNonTrivialToPrimitiveCopy(bool V) {
   3932     RecordDeclBits.NonTrivialToPrimitiveCopy = V;
   3933   }
   3934 
   3935   bool isNonTrivialToPrimitiveDestroy() const {
   3936     return RecordDeclBits.NonTrivialToPrimitiveDestroy;
   3937   }
   3938 
   3939   void setNonTrivialToPrimitiveDestroy(bool V) {
   3940     RecordDeclBits.NonTrivialToPrimitiveDestroy = V;
   3941   }
   3942 
   3943   bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const {
   3944     return RecordDeclBits.HasNonTrivialToPrimitiveDefaultInitializeCUnion;
   3945   }
   3946 
   3947   void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V) {
   3948     RecordDeclBits.HasNonTrivialToPrimitiveDefaultInitializeCUnion = V;
   3949   }
   3950 
   3951   bool hasNonTrivialToPrimitiveDestructCUnion() const {
   3952     return RecordDeclBits.HasNonTrivialToPrimitiveDestructCUnion;
   3953   }
   3954 
   3955   void setHasNonTrivialToPrimitiveDestructCUnion(bool V) {
   3956     RecordDeclBits.HasNonTrivialToPrimitiveDestructCUnion = V;
   3957   }
   3958 
   3959   bool hasNonTrivialToPrimitiveCopyCUnion() const {
   3960     return RecordDeclBits.HasNonTrivialToPrimitiveCopyCUnion;
   3961   }
   3962 
   3963   void setHasNonTrivialToPrimitiveCopyCUnion(bool V) {
   3964     RecordDeclBits.HasNonTrivialToPrimitiveCopyCUnion = V;
   3965   }
   3966 
   3967   /// Determine whether this class can be passed in registers. In C++ mode,
   3968   /// it must have at least one trivial, non-deleted copy or move constructor.
   3969   /// FIXME: This should be set as part of completeDefinition.
   3970   bool canPassInRegisters() const {
   3971     return getArgPassingRestrictions() == APK_CanPassInRegs;
   3972   }
   3973 
   3974   ArgPassingKind getArgPassingRestrictions() const {
   3975     return static_cast<ArgPassingKind>(RecordDeclBits.ArgPassingRestrictions);
   3976   }
   3977 
   3978   void setArgPassingRestrictions(ArgPassingKind Kind) {
   3979     RecordDeclBits.ArgPassingRestrictions = Kind;
   3980   }
   3981 
   3982   bool isParamDestroyedInCallee() const {
   3983     return RecordDeclBits.ParamDestroyedInCallee;
   3984   }
   3985 
   3986   void setParamDestroyedInCallee(bool V) {
   3987     RecordDeclBits.ParamDestroyedInCallee = V;
   3988   }
   3989 
   3990   /// Determines whether this declaration represents the
   3991   /// injected class name.
   3992   ///
   3993   /// The injected class name in C++ is the name of the class that
   3994   /// appears inside the class itself. For example:
   3995   ///
   3996   /// \code
   3997   /// struct C {
   3998   ///   // C is implicitly declared here as a synonym for the class name.
   3999   /// };
   4000   ///
   4001   /// C::C c; // same as "C c;"
   4002   /// \endcode
   4003   bool isInjectedClassName() const;
   4004 
   4005   /// Determine whether this record is a class describing a lambda
   4006   /// function object.
   4007   bool isLambda() const;
   4008 
   4009   /// Determine whether this record is a record for captured variables in
   4010   /// CapturedStmt construct.
   4011   bool isCapturedRecord() const;
   4012 
   4013   /// Mark the record as a record for captured variables in CapturedStmt
   4014   /// construct.
   4015   void setCapturedRecord();
   4016 
   4017   /// Returns the RecordDecl that actually defines
   4018   ///  this struct/union/class.  When determining whether or not a
   4019   ///  struct/union/class is completely defined, one should use this
   4020   ///  method as opposed to 'isCompleteDefinition'.
   4021   ///  'isCompleteDefinition' indicates whether or not a specific
   4022   ///  RecordDecl is a completed definition, not whether or not the
   4023   ///  record type is defined.  This method returns NULL if there is
   4024   ///  no RecordDecl that defines the struct/union/tag.
   4025   RecordDecl *getDefinition() const {
   4026     return cast_or_null<RecordDecl>(TagDecl::getDefinition());
   4027   }
   4028 
   4029   /// Returns whether this record is a union, or contains (at any nesting level)
   4030   /// a union member. This is used by CMSE to warn about possible information
   4031   /// leaks.
   4032   bool isOrContainsUnion() const;
   4033 
   4034   // Iterator access to field members. The field iterator only visits
   4035   // the non-static data members of this class, ignoring any static
   4036   // data members, functions, constructors, destructors, etc.
   4037   using field_iterator = specific_decl_iterator<FieldDecl>;
   4038   using field_range = llvm::iterator_range<specific_decl_iterator<FieldDecl>>;
   4039 
   4040   field_range fields() const { return field_range(field_begin(), field_end()); }
   4041   field_iterator field_begin() const;
   4042 
   4043   field_iterator field_end() const {
   4044     return field_iterator(decl_iterator());
   4045   }
   4046 
   4047   // Whether there are any fields (non-static data members) in this record.
   4048   bool field_empty() const {
   4049     return field_begin() == field_end();
   4050   }
   4051 
   4052   /// Note that the definition of this type is now complete.
   4053   virtual void completeDefinition();
   4054 
   4055   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4056   static bool classofKind(Kind K) {
   4057     return K >= firstRecord && K <= lastRecord;
   4058   }
   4059 
   4060   /// Get whether or not this is an ms_struct which can
   4061   /// be turned on with an attribute, pragma, or -mms-bitfields
   4062   /// commandline option.
   4063   bool isMsStruct(const ASTContext &C) const;
   4064 
   4065   /// Whether we are allowed to insert extra padding between fields.
   4066   /// These padding are added to help AddressSanitizer detect
   4067   /// intra-object-overflow bugs.
   4068   bool mayInsertExtraPadding(bool EmitRemark = false) const;
   4069 
   4070   /// Finds the first data member which has a name.
   4071   /// nullptr is returned if no named data member exists.
   4072   const FieldDecl *findFirstNamedDataMember() const;
   4073 
   4074 private:
   4075   /// Deserialize just the fields.
   4076   void LoadFieldsFromExternalStorage() const;
   4077 };
   4078 
   4079 class FileScopeAsmDecl : public Decl {
   4080   StringLiteral *AsmString;
   4081   SourceLocation RParenLoc;
   4082 
   4083   FileScopeAsmDecl(DeclContext *DC, StringLiteral *asmstring,
   4084                    SourceLocation StartL, SourceLocation EndL)
   4085     : Decl(FileScopeAsm, DC, StartL), AsmString(asmstring), RParenLoc(EndL) {}
   4086 
   4087   virtual void anchor();
   4088 
   4089 public:
   4090   static FileScopeAsmDecl *Create(ASTContext &C, DeclContext *DC,
   4091                                   StringLiteral *Str, SourceLocation AsmLoc,
   4092                                   SourceLocation RParenLoc);
   4093 
   4094   static FileScopeAsmDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   4095 
   4096   SourceLocation getAsmLoc() const { return getLocation(); }
   4097   SourceLocation getRParenLoc() const { return RParenLoc; }
   4098   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   4099   SourceRange getSourceRange() const override LLVM_READONLY {
   4100     return SourceRange(getAsmLoc(), getRParenLoc());
   4101   }
   4102 
   4103   const StringLiteral *getAsmString() const { return AsmString; }
   4104   StringLiteral *getAsmString() { return AsmString; }
   4105   void setAsmString(StringLiteral *Asm) { AsmString = Asm; }
   4106 
   4107   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4108   static bool classofKind(Kind K) { return K == FileScopeAsm; }
   4109 };
   4110 
   4111 /// Represents a block literal declaration, which is like an
   4112 /// unnamed FunctionDecl.  For example:
   4113 /// ^{ statement-body }   or   ^(int arg1, float arg2){ statement-body }
   4114 class BlockDecl : public Decl, public DeclContext {
   4115   // This class stores some data in DeclContext::BlockDeclBits
   4116   // to save some space. Use the provided accessors to access it.
   4117 public:
   4118   /// A class which contains all the information about a particular
   4119   /// captured value.
   4120   class Capture {
   4121     enum {
   4122       flag_isByRef = 0x1,
   4123       flag_isNested = 0x2
   4124     };
   4125 
   4126     /// The variable being captured.
   4127     llvm::PointerIntPair<VarDecl*, 2> VariableAndFlags;
   4128 
   4129     /// The copy expression, expressed in terms of a DeclRef (or
   4130     /// BlockDeclRef) to the captured variable.  Only required if the
   4131     /// variable has a C++ class type.
   4132     Expr *CopyExpr;
   4133 
   4134   public:
   4135     Capture(VarDecl *variable, bool byRef, bool nested, Expr *copy)
   4136       : VariableAndFlags(variable,
   4137                   (byRef ? flag_isByRef : 0) | (nested ? flag_isNested : 0)),
   4138         CopyExpr(copy) {}
   4139 
   4140     /// The variable being captured.
   4141     VarDecl *getVariable() const { return VariableAndFlags.getPointer(); }
   4142 
   4143     /// Whether this is a "by ref" capture, i.e. a capture of a __block
   4144     /// variable.
   4145     bool isByRef() const { return VariableAndFlags.getInt() & flag_isByRef; }
   4146 
   4147     bool isEscapingByref() const {
   4148       return getVariable()->isEscapingByref();
   4149     }
   4150 
   4151     bool isNonEscapingByref() const {
   4152       return getVariable()->isNonEscapingByref();
   4153     }
   4154 
   4155     /// Whether this is a nested capture, i.e. the variable captured
   4156     /// is not from outside the immediately enclosing function/block.
   4157     bool isNested() const { return VariableAndFlags.getInt() & flag_isNested; }
   4158 
   4159     bool hasCopyExpr() const { return CopyExpr != nullptr; }
   4160     Expr *getCopyExpr() const { return CopyExpr; }
   4161     void setCopyExpr(Expr *e) { CopyExpr = e; }
   4162   };
   4163 
   4164 private:
   4165   /// A new[]'d array of pointers to ParmVarDecls for the formal
   4166   /// parameters of this function.  This is null if a prototype or if there are
   4167   /// no formals.
   4168   ParmVarDecl **ParamInfo = nullptr;
   4169   unsigned NumParams = 0;
   4170 
   4171   Stmt *Body = nullptr;
   4172   TypeSourceInfo *SignatureAsWritten = nullptr;
   4173 
   4174   const Capture *Captures = nullptr;
   4175   unsigned NumCaptures = 0;
   4176 
   4177   unsigned ManglingNumber = 0;
   4178   Decl *ManglingContextDecl = nullptr;
   4179 
   4180 protected:
   4181   BlockDecl(DeclContext *DC, SourceLocation CaretLoc);
   4182 
   4183 public:
   4184   static BlockDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L);
   4185   static BlockDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   4186 
   4187   SourceLocation getCaretLocation() const { return getLocation(); }
   4188 
   4189   bool isVariadic() const { return BlockDeclBits.IsVariadic; }
   4190   void setIsVariadic(bool value) { BlockDeclBits.IsVariadic = value; }
   4191 
   4192   CompoundStmt *getCompoundBody() const { return (CompoundStmt*) Body; }
   4193   Stmt *getBody() const override { return (Stmt*) Body; }
   4194   void setBody(CompoundStmt *B) { Body = (Stmt*) B; }
   4195 
   4196   void setSignatureAsWritten(TypeSourceInfo *Sig) { SignatureAsWritten = Sig; }
   4197   TypeSourceInfo *getSignatureAsWritten() const { return SignatureAsWritten; }
   4198 
   4199   // ArrayRef access to formal parameters.
   4200   ArrayRef<ParmVarDecl *> parameters() const {
   4201     return {ParamInfo, getNumParams()};
   4202   }
   4203   MutableArrayRef<ParmVarDecl *> parameters() {
   4204     return {ParamInfo, getNumParams()};
   4205   }
   4206 
   4207   // Iterator access to formal parameters.
   4208   using param_iterator = MutableArrayRef<ParmVarDecl *>::iterator;
   4209   using param_const_iterator = ArrayRef<ParmVarDecl *>::const_iterator;
   4210 
   4211   bool param_empty() const { return parameters().empty(); }
   4212   param_iterator param_begin() { return parameters().begin(); }
   4213   param_iterator param_end() { return parameters().end(); }
   4214   param_const_iterator param_begin() const { return parameters().begin(); }
   4215   param_const_iterator param_end() const { return parameters().end(); }
   4216   size_t param_size() const { return parameters().size(); }
   4217 
   4218   unsigned getNumParams() const { return NumParams; }
   4219 
   4220   const ParmVarDecl *getParamDecl(unsigned i) const {
   4221     assert(i < getNumParams() && "Illegal param #");
   4222     return ParamInfo[i];
   4223   }
   4224   ParmVarDecl *getParamDecl(unsigned i) {
   4225     assert(i < getNumParams() && "Illegal param #");
   4226     return ParamInfo[i];
   4227   }
   4228 
   4229   void setParams(ArrayRef<ParmVarDecl *> NewParamInfo);
   4230 
   4231   /// True if this block (or its nested blocks) captures
   4232   /// anything of local storage from its enclosing scopes.
   4233   bool hasCaptures() const { return NumCaptures || capturesCXXThis(); }
   4234 
   4235   /// Returns the number of captured variables.
   4236   /// Does not include an entry for 'this'.
   4237   unsigned getNumCaptures() const { return NumCaptures; }
   4238 
   4239   using capture_const_iterator = ArrayRef<Capture>::const_iterator;
   4240 
   4241   ArrayRef<Capture> captures() const { return {Captures, NumCaptures}; }
   4242 
   4243   capture_const_iterator capture_begin() const { return captures().begin(); }
   4244   capture_const_iterator capture_end() const { return captures().end(); }
   4245 
   4246   bool capturesCXXThis() const { return BlockDeclBits.CapturesCXXThis; }
   4247   void setCapturesCXXThis(bool B = true) { BlockDeclBits.CapturesCXXThis = B; }
   4248 
   4249   bool blockMissingReturnType() const {
   4250     return BlockDeclBits.BlockMissingReturnType;
   4251   }
   4252 
   4253   void setBlockMissingReturnType(bool val = true) {
   4254     BlockDeclBits.BlockMissingReturnType = val;
   4255   }
   4256 
   4257   bool isConversionFromLambda() const {
   4258     return BlockDeclBits.IsConversionFromLambda;
   4259   }
   4260 
   4261   void setIsConversionFromLambda(bool val = true) {
   4262     BlockDeclBits.IsConversionFromLambda = val;
   4263   }
   4264 
   4265   bool doesNotEscape() const { return BlockDeclBits.DoesNotEscape; }
   4266   void setDoesNotEscape(bool B = true) { BlockDeclBits.DoesNotEscape = B; }
   4267 
   4268   bool canAvoidCopyToHeap() const {
   4269     return BlockDeclBits.CanAvoidCopyToHeap;
   4270   }
   4271   void setCanAvoidCopyToHeap(bool B = true) {
   4272     BlockDeclBits.CanAvoidCopyToHeap = B;
   4273   }
   4274 
   4275   bool capturesVariable(const VarDecl *var) const;
   4276 
   4277   void setCaptures(ASTContext &Context, ArrayRef<Capture> Captures,
   4278                    bool CapturesCXXThis);
   4279 
   4280   unsigned getBlockManglingNumber() const { return ManglingNumber; }
   4281 
   4282   Decl *getBlockManglingContextDecl() const { return ManglingContextDecl; }
   4283 
   4284   void setBlockMangling(unsigned Number, Decl *Ctx) {
   4285     ManglingNumber = Number;
   4286     ManglingContextDecl = Ctx;
   4287   }
   4288 
   4289   SourceRange getSourceRange() const override LLVM_READONLY;
   4290 
   4291   // Implement isa/cast/dyncast/etc.
   4292   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4293   static bool classofKind(Kind K) { return K == Block; }
   4294   static DeclContext *castToDeclContext(const BlockDecl *D) {
   4295     return static_cast<DeclContext *>(const_cast<BlockDecl*>(D));
   4296   }
   4297   static BlockDecl *castFromDeclContext(const DeclContext *DC) {
   4298     return static_cast<BlockDecl *>(const_cast<DeclContext*>(DC));
   4299   }
   4300 };
   4301 
   4302 /// Represents the body of a CapturedStmt, and serves as its DeclContext.
   4303 class CapturedDecl final
   4304     : public Decl,
   4305       public DeclContext,
   4306       private llvm::TrailingObjects<CapturedDecl, ImplicitParamDecl *> {
   4307 protected:
   4308   size_t numTrailingObjects(OverloadToken<ImplicitParamDecl>) {
   4309     return NumParams;
   4310   }
   4311 
   4312 private:
   4313   /// The number of parameters to the outlined function.
   4314   unsigned NumParams;
   4315 
   4316   /// The position of context parameter in list of parameters.
   4317   unsigned ContextParam;
   4318 
   4319   /// The body of the outlined function.
   4320   llvm::PointerIntPair<Stmt *, 1, bool> BodyAndNothrow;
   4321 
   4322   explicit CapturedDecl(DeclContext *DC, unsigned NumParams);
   4323 
   4324   ImplicitParamDecl *const *getParams() const {
   4325     return getTrailingObjects<ImplicitParamDecl *>();
   4326   }
   4327 
   4328   ImplicitParamDecl **getParams() {
   4329     return getTrailingObjects<ImplicitParamDecl *>();
   4330   }
   4331 
   4332 public:
   4333   friend class ASTDeclReader;
   4334   friend class ASTDeclWriter;
   4335   friend TrailingObjects;
   4336 
   4337   static CapturedDecl *Create(ASTContext &C, DeclContext *DC,
   4338                               unsigned NumParams);
   4339   static CapturedDecl *CreateDeserialized(ASTContext &C, unsigned ID,
   4340                                           unsigned NumParams);
   4341 
   4342   Stmt *getBody() const override;
   4343   void setBody(Stmt *B);
   4344 
   4345   bool isNothrow() const;
   4346   void setNothrow(bool Nothrow = true);
   4347 
   4348   unsigned getNumParams() const { return NumParams; }
   4349 
   4350   ImplicitParamDecl *getParam(unsigned i) const {
   4351     assert(i < NumParams);
   4352     return getParams()[i];
   4353   }
   4354   void setParam(unsigned i, ImplicitParamDecl *P) {
   4355     assert(i < NumParams);
   4356     getParams()[i] = P;
   4357   }
   4358 
   4359   // ArrayRef interface to parameters.
   4360   ArrayRef<ImplicitParamDecl *> parameters() const {
   4361     return {getParams(), getNumParams()};
   4362   }
   4363   MutableArrayRef<ImplicitParamDecl *> parameters() {
   4364     return {getParams(), getNumParams()};
   4365   }
   4366 
   4367   /// Retrieve the parameter containing captured variables.
   4368   ImplicitParamDecl *getContextParam() const {
   4369     assert(ContextParam < NumParams);
   4370     return getParam(ContextParam);
   4371   }
   4372   void setContextParam(unsigned i, ImplicitParamDecl *P) {
   4373     assert(i < NumParams);
   4374     ContextParam = i;
   4375     setParam(i, P);
   4376   }
   4377   unsigned getContextParamPosition() const { return ContextParam; }
   4378 
   4379   using param_iterator = ImplicitParamDecl *const *;
   4380   using param_range = llvm::iterator_range<param_iterator>;
   4381 
   4382   /// Retrieve an iterator pointing to the first parameter decl.
   4383   param_iterator param_begin() const { return getParams(); }
   4384   /// Retrieve an iterator one past the last parameter decl.
   4385   param_iterator param_end() const { return getParams() + NumParams; }
   4386 
   4387   // Implement isa/cast/dyncast/etc.
   4388   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4389   static bool classofKind(Kind K) { return K == Captured; }
   4390   static DeclContext *castToDeclContext(const CapturedDecl *D) {
   4391     return static_cast<DeclContext *>(const_cast<CapturedDecl *>(D));
   4392   }
   4393   static CapturedDecl *castFromDeclContext(const DeclContext *DC) {
   4394     return static_cast<CapturedDecl *>(const_cast<DeclContext *>(DC));
   4395   }
   4396 };
   4397 
   4398 /// Describes a module import declaration, which makes the contents
   4399 /// of the named module visible in the current translation unit.
   4400 ///
   4401 /// An import declaration imports the named module (or submodule). For example:
   4402 /// \code
   4403 ///   @import std.vector;
   4404 /// \endcode
   4405 ///
   4406 /// Import declarations can also be implicitly generated from
   4407 /// \#include/\#import directives.
   4408 class ImportDecl final : public Decl,
   4409                          llvm::TrailingObjects<ImportDecl, SourceLocation> {
   4410   friend class ASTContext;
   4411   friend class ASTDeclReader;
   4412   friend class ASTReader;
   4413   friend TrailingObjects;
   4414 
   4415   /// The imported module.
   4416   Module *ImportedModule = nullptr;
   4417 
   4418   /// The next import in the list of imports local to the translation
   4419   /// unit being parsed (not loaded from an AST file).
   4420   ///
   4421   /// Includes a bit that indicates whether we have source-location information
   4422   /// for each identifier in the module name.
   4423   ///
   4424   /// When the bit is false, we only have a single source location for the
   4425   /// end of the import declaration.
   4426   llvm::PointerIntPair<ImportDecl *, 1, bool> NextLocalImportAndComplete;
   4427 
   4428   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
   4429              ArrayRef<SourceLocation> IdentifierLocs);
   4430 
   4431   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
   4432              SourceLocation EndLoc);
   4433 
   4434   ImportDecl(EmptyShell Empty) : Decl(Import, Empty) {}
   4435 
   4436   bool isImportComplete() const { return NextLocalImportAndComplete.getInt(); }
   4437 
   4438   void setImportComplete(bool C) { NextLocalImportAndComplete.setInt(C); }
   4439 
   4440   /// The next import in the list of imports local to the translation
   4441   /// unit being parsed (not loaded from an AST file).
   4442   ImportDecl *getNextLocalImport() const {
   4443     return NextLocalImportAndComplete.getPointer();
   4444   }
   4445 
   4446   void setNextLocalImport(ImportDecl *Import) {
   4447     NextLocalImportAndComplete.setPointer(Import);
   4448   }
   4449 
   4450 public:
   4451   /// Create a new module import declaration.
   4452   static ImportDecl *Create(ASTContext &C, DeclContext *DC,
   4453                             SourceLocation StartLoc, Module *Imported,
   4454                             ArrayRef<SourceLocation> IdentifierLocs);
   4455 
   4456   /// Create a new module import declaration for an implicitly-generated
   4457   /// import.
   4458   static ImportDecl *CreateImplicit(ASTContext &C, DeclContext *DC,
   4459                                     SourceLocation StartLoc, Module *Imported,
   4460                                     SourceLocation EndLoc);
   4461 
   4462   /// Create a new, deserialized module import declaration.
   4463   static ImportDecl *CreateDeserialized(ASTContext &C, unsigned ID,
   4464                                         unsigned NumLocations);
   4465 
   4466   /// Retrieve the module that was imported by the import declaration.
   4467   Module *getImportedModule() const { return ImportedModule; }
   4468 
   4469   /// Retrieves the locations of each of the identifiers that make up
   4470   /// the complete module name in the import declaration.
   4471   ///
   4472   /// This will return an empty array if the locations of the individual
   4473   /// identifiers aren't available.
   4474   ArrayRef<SourceLocation> getIdentifierLocs() const;
   4475 
   4476   SourceRange getSourceRange() const override LLVM_READONLY;
   4477 
   4478   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4479   static bool classofKind(Kind K) { return K == Import; }
   4480 };
   4481 
   4482 /// Represents a C++ Modules TS module export declaration.
   4483 ///
   4484 /// For example:
   4485 /// \code
   4486 ///   export void foo();
   4487 /// \endcode
   4488 class ExportDecl final : public Decl, public DeclContext {
   4489   virtual void anchor();
   4490 
   4491 private:
   4492   friend class ASTDeclReader;
   4493 
   4494   /// The source location for the right brace (if valid).
   4495   SourceLocation RBraceLoc;
   4496 
   4497   ExportDecl(DeclContext *DC, SourceLocation ExportLoc)
   4498       : Decl(Export, DC, ExportLoc), DeclContext(Export),
   4499         RBraceLoc(SourceLocation()) {}
   4500 
   4501 public:
   4502   static ExportDecl *Create(ASTContext &C, DeclContext *DC,
   4503                             SourceLocation ExportLoc);
   4504   static ExportDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   4505 
   4506   SourceLocation getExportLoc() const { return getLocation(); }
   4507   SourceLocation getRBraceLoc() const { return RBraceLoc; }
   4508   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
   4509 
   4510   bool hasBraces() const { return RBraceLoc.isValid(); }
   4511 
   4512   SourceLocation getEndLoc() const LLVM_READONLY {
   4513     if (hasBraces())
   4514       return RBraceLoc;
   4515     // No braces: get the end location of the (only) declaration in context
   4516     // (if present).
   4517     return decls_empty() ? getLocation() : decls_begin()->getEndLoc();
   4518   }
   4519 
   4520   SourceRange getSourceRange() const override LLVM_READONLY {
   4521     return SourceRange(getLocation(), getEndLoc());
   4522   }
   4523 
   4524   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4525   static bool classofKind(Kind K) { return K == Export; }
   4526   static DeclContext *castToDeclContext(const ExportDecl *D) {
   4527     return static_cast<DeclContext *>(const_cast<ExportDecl*>(D));
   4528   }
   4529   static ExportDecl *castFromDeclContext(const DeclContext *DC) {
   4530     return static_cast<ExportDecl *>(const_cast<DeclContext*>(DC));
   4531   }
   4532 };
   4533 
   4534 /// Represents an empty-declaration.
   4535 class EmptyDecl : public Decl {
   4536   EmptyDecl(DeclContext *DC, SourceLocation L) : Decl(Empty, DC, L) {}
   4537 
   4538   virtual void anchor();
   4539 
   4540 public:
   4541   static EmptyDecl *Create(ASTContext &C, DeclContext *DC,
   4542                            SourceLocation L);
   4543   static EmptyDecl *CreateDeserialized(ASTContext &C, unsigned ID);
   4544 
   4545   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   4546   static bool classofKind(Kind K) { return K == Empty; }
   4547 };
   4548 
   4549 /// Insertion operator for diagnostics.  This allows sending NamedDecl's
   4550 /// into a diagnostic with <<.
   4551 inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
   4552                                              const NamedDecl *ND) {
   4553   PD.AddTaggedVal(reinterpret_cast<intptr_t>(ND),
   4554                   DiagnosticsEngine::ak_nameddecl);
   4555   return PD;
   4556 }
   4557 
   4558 template<typename decl_type>
   4559 void Redeclarable<decl_type>::setPreviousDecl(decl_type *PrevDecl) {
   4560   // Note: This routine is implemented here because we need both NamedDecl
   4561   // and Redeclarable to be defined.
   4562   assert(RedeclLink.isFirst() &&
   4563          "setPreviousDecl on a decl already in a redeclaration chain");
   4564 
   4565   if (PrevDecl) {
   4566     // Point to previous. Make sure that this is actually the most recent
   4567     // redeclaration, or we can build invalid chains. If the most recent
   4568     // redeclaration is invalid, it won't be PrevDecl, but we want it anyway.
   4569     First = PrevDecl->getFirstDecl();
   4570     assert(First->RedeclLink.isFirst() && "Expected first");
   4571     decl_type *MostRecent = First->getNextRedeclaration();
   4572     RedeclLink = PreviousDeclLink(cast<decl_type>(MostRecent));
   4573 
   4574     // If the declaration was previously visible, a redeclaration of it remains
   4575     // visible even if it wouldn't be visible by itself.
   4576     static_cast<decl_type*>(this)->IdentifierNamespace |=
   4577       MostRecent->getIdentifierNamespace() &
   4578       (Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Type);
   4579   } else {
   4580     // Make this first.
   4581     First = static_cast<decl_type*>(this);
   4582   }
   4583 
   4584   // First one will point to this one as latest.
   4585   First->RedeclLink.setLatest(static_cast<decl_type*>(this));
   4586 
   4587   assert(!isa<NamedDecl>(static_cast<decl_type*>(this)) ||
   4588          cast<NamedDecl>(static_cast<decl_type*>(this))->isLinkageValid());
   4589 }
   4590 
   4591 // Inline function definitions.
   4592 
   4593 /// Check if the given decl is complete.
   4594 ///
   4595 /// We use this function to break a cycle between the inline definitions in
   4596 /// Type.h and Decl.h.
   4597 inline bool IsEnumDeclComplete(EnumDecl *ED) {
   4598   return ED->isComplete();
   4599 }
   4600 
   4601 /// Check if the given decl is scoped.
   4602 ///
   4603 /// We use this function to break a cycle between the inline definitions in
   4604 /// Type.h and Decl.h.
   4605 inline bool IsEnumDeclScoped(EnumDecl *ED) {
   4606   return ED->isScoped();
   4607 }
   4608 
   4609 /// OpenMP variants are mangled early based on their OpenMP context selector.
   4610 /// The new name looks likes this:
   4611 ///  <name> + OpenMPVariantManglingSeparatorStr + <mangled OpenMP context>
   4612 static constexpr StringRef getOpenMPVariantManglingSeparatorStr() {
   4613   return "$ompvariant";
   4614 }
   4615 
   4616 } // namespace clang
   4617 
   4618 #endif // LLVM_CLANG_AST_DECL_H
   4619