Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:36:31

0001 //===- Decl.h - Classes for representing declarations -----------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 //  This file defines the Decl subclasses.
0010 //
0011 //===----------------------------------------------------------------------===//
0012 
0013 #ifndef LLVM_CLANG_AST_DECL_H
0014 #define LLVM_CLANG_AST_DECL_H
0015 
0016 #include "clang/AST/APNumericStorage.h"
0017 #include "clang/AST/APValue.h"
0018 #include "clang/AST/ASTContextAllocate.h"
0019 #include "clang/AST/DeclAccessPair.h"
0020 #include "clang/AST/DeclBase.h"
0021 #include "clang/AST/DeclarationName.h"
0022 #include "clang/AST/ExternalASTSource.h"
0023 #include "clang/AST/NestedNameSpecifier.h"
0024 #include "clang/AST/Redeclarable.h"
0025 #include "clang/AST/Type.h"
0026 #include "clang/Basic/AddressSpaces.h"
0027 #include "clang/Basic/Diagnostic.h"
0028 #include "clang/Basic/IdentifierTable.h"
0029 #include "clang/Basic/LLVM.h"
0030 #include "clang/Basic/Linkage.h"
0031 #include "clang/Basic/OperatorKinds.h"
0032 #include "clang/Basic/PartialDiagnostic.h"
0033 #include "clang/Basic/PragmaKinds.h"
0034 #include "clang/Basic/SourceLocation.h"
0035 #include "clang/Basic/Specifiers.h"
0036 #include "clang/Basic/Visibility.h"
0037 #include "llvm/ADT/APSInt.h"
0038 #include "llvm/ADT/ArrayRef.h"
0039 #include "llvm/ADT/PointerIntPair.h"
0040 #include "llvm/ADT/PointerUnion.h"
0041 #include "llvm/ADT/StringRef.h"
0042 #include "llvm/ADT/iterator_range.h"
0043 #include "llvm/Support/Casting.h"
0044 #include "llvm/Support/Compiler.h"
0045 #include "llvm/Support/TrailingObjects.h"
0046 #include <cassert>
0047 #include <cstddef>
0048 #include <cstdint>
0049 #include <optional>
0050 #include <string>
0051 #include <utility>
0052 
0053 namespace clang {
0054 
0055 class ASTContext;
0056 struct ASTTemplateArgumentListInfo;
0057 class CompoundStmt;
0058 class DependentFunctionTemplateSpecializationInfo;
0059 class EnumDecl;
0060 class Expr;
0061 class FunctionTemplateDecl;
0062 class FunctionTemplateSpecializationInfo;
0063 class FunctionTypeLoc;
0064 class LabelStmt;
0065 class MemberSpecializationInfo;
0066 class Module;
0067 class NamespaceDecl;
0068 class ParmVarDecl;
0069 class RecordDecl;
0070 class Stmt;
0071 class StringLiteral;
0072 class TagDecl;
0073 class TemplateArgumentList;
0074 class TemplateArgumentListInfo;
0075 class TemplateParameterList;
0076 class TypeAliasTemplateDecl;
0077 class UnresolvedSetImpl;
0078 class VarTemplateDecl;
0079 enum class ImplicitParamKind;
0080 
0081 /// The top declaration context.
0082 class TranslationUnitDecl : public Decl,
0083                             public DeclContext,
0084                             public Redeclarable<TranslationUnitDecl> {
0085   using redeclarable_base = Redeclarable<TranslationUnitDecl>;
0086 
0087   TranslationUnitDecl *getNextRedeclarationImpl() override {
0088     return getNextRedeclaration();
0089   }
0090 
0091   TranslationUnitDecl *getPreviousDeclImpl() override {
0092     return getPreviousDecl();
0093   }
0094 
0095   TranslationUnitDecl *getMostRecentDeclImpl() override {
0096     return getMostRecentDecl();
0097   }
0098 
0099   ASTContext &Ctx;
0100 
0101   /// The (most recently entered) anonymous namespace for this
0102   /// translation unit, if one has been created.
0103   NamespaceDecl *AnonymousNamespace = nullptr;
0104 
0105   explicit TranslationUnitDecl(ASTContext &ctx);
0106 
0107   virtual void anchor();
0108 
0109 public:
0110   using redecl_range = redeclarable_base::redecl_range;
0111   using redecl_iterator = redeclarable_base::redecl_iterator;
0112 
0113   using redeclarable_base::getMostRecentDecl;
0114   using redeclarable_base::getPreviousDecl;
0115   using redeclarable_base::isFirstDecl;
0116   using redeclarable_base::redecls;
0117   using redeclarable_base::redecls_begin;
0118   using redeclarable_base::redecls_end;
0119 
0120   ASTContext &getASTContext() const { return Ctx; }
0121 
0122   NamespaceDecl *getAnonymousNamespace() const { return AnonymousNamespace; }
0123   void setAnonymousNamespace(NamespaceDecl *D);
0124 
0125   static TranslationUnitDecl *Create(ASTContext &C);
0126 
0127   // Implement isa/cast/dyncast/etc.
0128   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0129   static bool classofKind(Kind K) { return K == TranslationUnit; }
0130   static DeclContext *castToDeclContext(const TranslationUnitDecl *D) {
0131     return static_cast<DeclContext *>(const_cast<TranslationUnitDecl*>(D));
0132   }
0133   static TranslationUnitDecl *castFromDeclContext(const DeclContext *DC) {
0134     return static_cast<TranslationUnitDecl *>(const_cast<DeclContext*>(DC));
0135   }
0136 
0137   /// Retrieves the canonical declaration of this translation unit.
0138   TranslationUnitDecl *getCanonicalDecl() override { return getFirstDecl(); }
0139   const TranslationUnitDecl *getCanonicalDecl() const { return getFirstDecl(); }
0140 };
0141 
0142 /// Represents a `#pragma comment` line. Always a child of
0143 /// TranslationUnitDecl.
0144 class PragmaCommentDecl final
0145     : public Decl,
0146       private llvm::TrailingObjects<PragmaCommentDecl, char> {
0147   friend class ASTDeclReader;
0148   friend class ASTDeclWriter;
0149   friend TrailingObjects;
0150 
0151   PragmaMSCommentKind CommentKind;
0152 
0153   PragmaCommentDecl(TranslationUnitDecl *TU, SourceLocation CommentLoc,
0154                     PragmaMSCommentKind CommentKind)
0155       : Decl(PragmaComment, TU, CommentLoc), CommentKind(CommentKind) {}
0156 
0157   virtual void anchor();
0158 
0159 public:
0160   static PragmaCommentDecl *Create(const ASTContext &C, TranslationUnitDecl *DC,
0161                                    SourceLocation CommentLoc,
0162                                    PragmaMSCommentKind CommentKind,
0163                                    StringRef Arg);
0164   static PragmaCommentDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
0165                                                unsigned ArgSize);
0166 
0167   PragmaMSCommentKind getCommentKind() const { return CommentKind; }
0168 
0169   StringRef getArg() const { return getTrailingObjects<char>(); }
0170 
0171   // Implement isa/cast/dyncast/etc.
0172   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0173   static bool classofKind(Kind K) { return K == PragmaComment; }
0174 };
0175 
0176 /// Represents a `#pragma detect_mismatch` line. Always a child of
0177 /// TranslationUnitDecl.
0178 class PragmaDetectMismatchDecl final
0179     : public Decl,
0180       private llvm::TrailingObjects<PragmaDetectMismatchDecl, char> {
0181   friend class ASTDeclReader;
0182   friend class ASTDeclWriter;
0183   friend TrailingObjects;
0184 
0185   size_t ValueStart;
0186 
0187   PragmaDetectMismatchDecl(TranslationUnitDecl *TU, SourceLocation Loc,
0188                            size_t ValueStart)
0189       : Decl(PragmaDetectMismatch, TU, Loc), ValueStart(ValueStart) {}
0190 
0191   virtual void anchor();
0192 
0193 public:
0194   static PragmaDetectMismatchDecl *Create(const ASTContext &C,
0195                                           TranslationUnitDecl *DC,
0196                                           SourceLocation Loc, StringRef Name,
0197                                           StringRef Value);
0198   static PragmaDetectMismatchDecl *
0199   CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize);
0200 
0201   StringRef getName() const { return getTrailingObjects<char>(); }
0202   StringRef getValue() const { return getTrailingObjects<char>() + ValueStart; }
0203 
0204   // Implement isa/cast/dyncast/etc.
0205   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0206   static bool classofKind(Kind K) { return K == PragmaDetectMismatch; }
0207 };
0208 
0209 /// Declaration context for names declared as extern "C" in C++. This
0210 /// is neither the semantic nor lexical context for such declarations, but is
0211 /// used to check for conflicts with other extern "C" declarations. Example:
0212 ///
0213 /// \code
0214 ///   namespace N { extern "C" void f(); } // #1
0215 ///   void N::f() {}                       // #2
0216 ///   namespace M { extern "C" void f(); } // #3
0217 /// \endcode
0218 ///
0219 /// The semantic context of #1 is namespace N and its lexical context is the
0220 /// LinkageSpecDecl; the semantic context of #2 is namespace N and its lexical
0221 /// context is the TU. However, both declarations are also visible in the
0222 /// extern "C" context.
0223 ///
0224 /// The declaration at #3 finds it is a redeclaration of \c N::f through
0225 /// lookup in the extern "C" context.
0226 class ExternCContextDecl : public Decl, public DeclContext {
0227   explicit ExternCContextDecl(TranslationUnitDecl *TU)
0228     : Decl(ExternCContext, TU, SourceLocation()),
0229       DeclContext(ExternCContext) {}
0230 
0231   virtual void anchor();
0232 
0233 public:
0234   static ExternCContextDecl *Create(const ASTContext &C,
0235                                     TranslationUnitDecl *TU);
0236 
0237   // Implement isa/cast/dyncast/etc.
0238   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0239   static bool classofKind(Kind K) { return K == ExternCContext; }
0240   static DeclContext *castToDeclContext(const ExternCContextDecl *D) {
0241     return static_cast<DeclContext *>(const_cast<ExternCContextDecl*>(D));
0242   }
0243   static ExternCContextDecl *castFromDeclContext(const DeclContext *DC) {
0244     return static_cast<ExternCContextDecl *>(const_cast<DeclContext*>(DC));
0245   }
0246 };
0247 
0248 /// This represents a decl that may have a name.  Many decls have names such
0249 /// as ObjCMethodDecl, but not \@class, etc.
0250 ///
0251 /// Note that not every NamedDecl is actually named (e.g., a struct might
0252 /// be anonymous), and not every name is an identifier.
0253 class NamedDecl : public Decl {
0254   /// The name of this declaration, which is typically a normal
0255   /// identifier but may also be a special kind of name (C++
0256   /// constructor, Objective-C selector, etc.)
0257   DeclarationName Name;
0258 
0259   virtual void anchor();
0260 
0261 private:
0262   NamedDecl *getUnderlyingDeclImpl() LLVM_READONLY;
0263 
0264 protected:
0265   NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
0266       : Decl(DK, DC, L), Name(N) {}
0267 
0268 public:
0269   /// Get the identifier that names this declaration, if there is one.
0270   ///
0271   /// This will return NULL if this declaration has no name (e.g., for
0272   /// an unnamed class) or if the name is a special name (C++ constructor,
0273   /// Objective-C selector, etc.).
0274   IdentifierInfo *getIdentifier() const { return Name.getAsIdentifierInfo(); }
0275 
0276   /// Get the name of identifier for this declaration as a StringRef.
0277   ///
0278   /// This requires that the declaration have a name and that it be a simple
0279   /// identifier.
0280   StringRef getName() const {
0281     assert(Name.isIdentifier() && "Name is not a simple identifier");
0282     return getIdentifier() ? getIdentifier()->getName() : "";
0283   }
0284 
0285   /// Get a human-readable name for the declaration, even if it is one of the
0286   /// special kinds of names (C++ constructor, Objective-C selector, etc).
0287   ///
0288   /// Creating this name requires expensive string manipulation, so it should
0289   /// be called only when performance doesn't matter. For simple declarations,
0290   /// getNameAsCString() should suffice.
0291   //
0292   // FIXME: This function should be renamed to indicate that it is not just an
0293   // alternate form of getName(), and clients should move as appropriate.
0294   //
0295   // FIXME: Deprecated, move clients to getName().
0296   std::string getNameAsString() const { return Name.getAsString(); }
0297 
0298   /// Pretty-print the unqualified name of this declaration. Can be overloaded
0299   /// by derived classes to provide a more user-friendly name when appropriate.
0300   virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const;
0301   /// Calls printName() with the ASTContext printing policy from the decl.
0302   void printName(raw_ostream &OS) const;
0303 
0304   /// Get the actual, stored name of the declaration, which may be a special
0305   /// name.
0306   ///
0307   /// Note that generally in diagnostics, the non-null \p NamedDecl* itself
0308   /// should be sent into the diagnostic instead of using the result of
0309   /// \p getDeclName().
0310   ///
0311   /// A \p DeclarationName in a diagnostic will just be streamed to the output,
0312   /// which will directly result in a call to \p DeclarationName::print.
0313   ///
0314   /// A \p NamedDecl* in a diagnostic will also ultimately result in a call to
0315   /// \p DeclarationName::print, but with two customisation points along the
0316   /// way (\p getNameForDiagnostic and \p printName). These are used to print
0317   /// the template arguments if any, and to provide a user-friendly name for
0318   /// some entities (such as unnamed variables and anonymous records).
0319   DeclarationName getDeclName() const { return Name; }
0320 
0321   /// Set the name of this declaration.
0322   void setDeclName(DeclarationName N) { Name = N; }
0323 
0324   /// Returns a human-readable qualified name for this declaration, like
0325   /// A::B::i, for i being member of namespace A::B.
0326   ///
0327   /// If the declaration is not a member of context which can be named (record,
0328   /// namespace), it will return the same result as printName().
0329   ///
0330   /// Creating this name is expensive, so it should be called only when
0331   /// performance doesn't matter.
0332   void printQualifiedName(raw_ostream &OS) const;
0333   void printQualifiedName(raw_ostream &OS, const PrintingPolicy &Policy) const;
0334 
0335   /// Print only the nested name specifier part of a fully-qualified name,
0336   /// including the '::' at the end. E.g.
0337   ///    when `printQualifiedName(D)` prints "A::B::i",
0338   ///    this function prints "A::B::".
0339   void printNestedNameSpecifier(raw_ostream &OS) const;
0340   void printNestedNameSpecifier(raw_ostream &OS,
0341                                 const PrintingPolicy &Policy) const;
0342 
0343   // FIXME: Remove string version.
0344   std::string getQualifiedNameAsString() const;
0345 
0346   /// Appends a human-readable name for this declaration into the given stream.
0347   ///
0348   /// This is the method invoked by Sema when displaying a NamedDecl
0349   /// in a diagnostic.  It does not necessarily produce the same
0350   /// result as printName(); for example, class template
0351   /// specializations are printed with their template arguments.
0352   virtual void getNameForDiagnostic(raw_ostream &OS,
0353                                     const PrintingPolicy &Policy,
0354                                     bool Qualified) const;
0355 
0356   /// Determine whether this declaration, if known to be well-formed within
0357   /// its context, will replace the declaration OldD if introduced into scope.
0358   ///
0359   /// A declaration will replace another declaration if, for example, it is
0360   /// a redeclaration of the same variable or function, but not if it is a
0361   /// declaration of a different kind (function vs. class) or an overloaded
0362   /// function.
0363   ///
0364   /// \param IsKnownNewer \c true if this declaration is known to be newer
0365   /// than \p OldD (for instance, if this declaration is newly-created).
0366   bool declarationReplaces(const NamedDecl *OldD,
0367                            bool IsKnownNewer = true) const;
0368 
0369   /// Determine whether this declaration has linkage.
0370   bool hasLinkage() const;
0371 
0372   using Decl::isModulePrivate;
0373   using Decl::setModulePrivate;
0374 
0375   /// Determine whether this declaration is a C++ class member.
0376   bool isCXXClassMember() const {
0377     const DeclContext *DC = getDeclContext();
0378 
0379     // C++0x [class.mem]p1:
0380     //   The enumerators of an unscoped enumeration defined in
0381     //   the class are members of the class.
0382     if (isa<EnumDecl>(DC))
0383       DC = DC->getRedeclContext();
0384 
0385     return DC->isRecord();
0386   }
0387 
0388   /// Determine whether the given declaration is an instance member of
0389   /// a C++ class.
0390   bool isCXXInstanceMember() const;
0391 
0392   /// Determine if the declaration obeys the reserved identifier rules of the
0393   /// given language.
0394   ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const;
0395 
0396   /// Determine what kind of linkage this entity has.
0397   ///
0398   /// This is not the linkage as defined by the standard or the codegen notion
0399   /// of linkage. It is just an implementation detail that is used to compute
0400   /// those.
0401   Linkage getLinkageInternal() const;
0402 
0403   /// Get the linkage from a semantic point of view. Entities in
0404   /// anonymous namespaces are external (in c++98).
0405   Linkage getFormalLinkage() const;
0406 
0407   /// True if this decl has external linkage.
0408   bool hasExternalFormalLinkage() const {
0409     return isExternalFormalLinkage(getLinkageInternal());
0410   }
0411 
0412   bool isExternallyVisible() const {
0413     return clang::isExternallyVisible(getLinkageInternal());
0414   }
0415 
0416   /// Determine whether this declaration can be redeclared in a
0417   /// different translation unit.
0418   bool isExternallyDeclarable() const {
0419     return isExternallyVisible() && !getOwningModuleForLinkage();
0420   }
0421 
0422   /// Determines the visibility of this entity.
0423   Visibility getVisibility() const {
0424     return getLinkageAndVisibility().getVisibility();
0425   }
0426 
0427   /// Determines the linkage and visibility of this entity.
0428   LinkageInfo getLinkageAndVisibility() const;
0429 
0430   /// Kinds of explicit visibility.
0431   enum ExplicitVisibilityKind {
0432     /// Do an LV computation for, ultimately, a type.
0433     /// Visibility may be restricted by type visibility settings and
0434     /// the visibility of template arguments.
0435     VisibilityForType,
0436 
0437     /// Do an LV computation for, ultimately, a non-type declaration.
0438     /// Visibility may be restricted by value visibility settings and
0439     /// the visibility of template arguments.
0440     VisibilityForValue
0441   };
0442 
0443   /// If visibility was explicitly specified for this
0444   /// declaration, return that visibility.
0445   std::optional<Visibility>
0446   getExplicitVisibility(ExplicitVisibilityKind kind) const;
0447 
0448   /// True if the computed linkage is valid. Used for consistency
0449   /// checking. Should always return true.
0450   bool isLinkageValid() const;
0451 
0452   /// True if something has required us to compute the linkage
0453   /// of this declaration.
0454   ///
0455   /// Language features which can retroactively change linkage (like a
0456   /// typedef name for linkage purposes) may need to consider this,
0457   /// but hopefully only in transitory ways during parsing.
0458   bool hasLinkageBeenComputed() const {
0459     return hasCachedLinkage();
0460   }
0461 
0462   bool isPlaceholderVar(const LangOptions &LangOpts) const;
0463 
0464   /// Looks through UsingDecls and ObjCCompatibleAliasDecls for
0465   /// the underlying named decl.
0466   NamedDecl *getUnderlyingDecl() {
0467     // Fast-path the common case.
0468     if (this->getKind() != UsingShadow &&
0469         this->getKind() != ConstructorUsingShadow &&
0470         this->getKind() != ObjCCompatibleAlias &&
0471         this->getKind() != NamespaceAlias)
0472       return this;
0473 
0474     return getUnderlyingDeclImpl();
0475   }
0476   const NamedDecl *getUnderlyingDecl() const {
0477     return const_cast<NamedDecl*>(this)->getUnderlyingDecl();
0478   }
0479 
0480   NamedDecl *getMostRecentDecl() {
0481     return cast<NamedDecl>(static_cast<Decl *>(this)->getMostRecentDecl());
0482   }
0483   const NamedDecl *getMostRecentDecl() const {
0484     return const_cast<NamedDecl*>(this)->getMostRecentDecl();
0485   }
0486 
0487   ObjCStringFormatFamily getObjCFStringFormattingFamily() const;
0488 
0489   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0490   static bool classofKind(Kind K) { return K >= firstNamed && K <= lastNamed; }
0491 };
0492 
0493 inline raw_ostream &operator<<(raw_ostream &OS, const NamedDecl &ND) {
0494   ND.printName(OS);
0495   return OS;
0496 }
0497 
0498 /// Represents the declaration of a label.  Labels also have a
0499 /// corresponding LabelStmt, which indicates the position that the label was
0500 /// defined at.  For normal labels, the location of the decl is the same as the
0501 /// location of the statement.  For GNU local labels (__label__), the decl
0502 /// location is where the __label__ is.
0503 class LabelDecl : public NamedDecl {
0504   LabelStmt *TheStmt;
0505   StringRef MSAsmName;
0506   bool MSAsmNameResolved = false;
0507 
0508   /// For normal labels, this is the same as the main declaration
0509   /// label, i.e., the location of the identifier; for GNU local labels,
0510   /// this is the location of the __label__ keyword.
0511   SourceLocation LocStart;
0512 
0513   LabelDecl(DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II,
0514             LabelStmt *S, SourceLocation StartL)
0515       : NamedDecl(Label, DC, IdentL, II), TheStmt(S), LocStart(StartL) {}
0516 
0517   void anchor() override;
0518 
0519 public:
0520   static LabelDecl *Create(ASTContext &C, DeclContext *DC,
0521                            SourceLocation IdentL, IdentifierInfo *II);
0522   static LabelDecl *Create(ASTContext &C, DeclContext *DC,
0523                            SourceLocation IdentL, IdentifierInfo *II,
0524                            SourceLocation GnuLabelL);
0525   static LabelDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
0526 
0527   LabelStmt *getStmt() const { return TheStmt; }
0528   void setStmt(LabelStmt *T) { TheStmt = T; }
0529 
0530   bool isGnuLocal() const { return LocStart != getLocation(); }
0531   void setLocStart(SourceLocation L) { LocStart = L; }
0532 
0533   SourceRange getSourceRange() const override LLVM_READONLY {
0534     return SourceRange(LocStart, getLocation());
0535   }
0536 
0537   bool isMSAsmLabel() const { return !MSAsmName.empty(); }
0538   bool isResolvedMSAsmLabel() const { return isMSAsmLabel() && MSAsmNameResolved; }
0539   void setMSAsmLabel(StringRef Name);
0540   StringRef getMSAsmLabel() const { return MSAsmName; }
0541   void setMSAsmLabelResolved() { MSAsmNameResolved = true; }
0542 
0543   // Implement isa/cast/dyncast/etc.
0544   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0545   static bool classofKind(Kind K) { return K == Label; }
0546 };
0547 
0548 /// Represent a C++ namespace.
0549 class NamespaceDecl : public NamedDecl,
0550                       public DeclContext,
0551                       public Redeclarable<NamespaceDecl> {
0552   /// The starting location of the source range, pointing
0553   /// to either the namespace or the inline keyword.
0554   SourceLocation LocStart;
0555 
0556   /// The ending location of the source range.
0557   SourceLocation RBraceLoc;
0558 
0559   /// The unnamed namespace that inhabits this namespace, if any.
0560   NamespaceDecl *AnonymousNamespace = nullptr;
0561 
0562   NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
0563                 SourceLocation StartLoc, SourceLocation IdLoc,
0564                 IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested);
0565 
0566   using redeclarable_base = Redeclarable<NamespaceDecl>;
0567 
0568   NamespaceDecl *getNextRedeclarationImpl() override;
0569   NamespaceDecl *getPreviousDeclImpl() override;
0570   NamespaceDecl *getMostRecentDeclImpl() override;
0571 
0572 public:
0573   friend class ASTDeclReader;
0574   friend class ASTDeclWriter;
0575 
0576   static NamespaceDecl *Create(ASTContext &C, DeclContext *DC, bool Inline,
0577                                SourceLocation StartLoc, SourceLocation IdLoc,
0578                                IdentifierInfo *Id, NamespaceDecl *PrevDecl,
0579                                bool Nested);
0580 
0581   static NamespaceDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
0582 
0583   using redecl_range = redeclarable_base::redecl_range;
0584   using redecl_iterator = redeclarable_base::redecl_iterator;
0585 
0586   using redeclarable_base::redecls_begin;
0587   using redeclarable_base::redecls_end;
0588   using redeclarable_base::redecls;
0589   using redeclarable_base::getPreviousDecl;
0590   using redeclarable_base::getMostRecentDecl;
0591   using redeclarable_base::isFirstDecl;
0592 
0593   /// Returns true if this is an anonymous namespace declaration.
0594   ///
0595   /// For example:
0596   /// \code
0597   ///   namespace {
0598   ///     ...
0599   ///   };
0600   /// \endcode
0601   /// q.v. C++ [namespace.unnamed]
0602   bool isAnonymousNamespace() const {
0603     return !getIdentifier();
0604   }
0605 
0606   /// Returns true if this is an inline namespace declaration.
0607   bool isInline() const { return NamespaceDeclBits.IsInline; }
0608 
0609   /// Set whether this is an inline namespace declaration.
0610   void setInline(bool Inline) { NamespaceDeclBits.IsInline = Inline; }
0611 
0612   /// Returns true if this is a nested namespace declaration.
0613   /// \code
0614   /// namespace outer::nested { }
0615   /// \endcode
0616   bool isNested() const { return NamespaceDeclBits.IsNested; }
0617 
0618   /// Set whether this is a nested namespace declaration.
0619   void setNested(bool Nested) { NamespaceDeclBits.IsNested = Nested; }
0620 
0621   /// Returns true if the inline qualifier for \c Name is redundant.
0622   bool isRedundantInlineQualifierFor(DeclarationName Name) const {
0623     if (!isInline())
0624       return false;
0625     auto X = lookup(Name);
0626     // We should not perform a lookup within a transparent context, so find a
0627     // non-transparent parent context.
0628     auto Y = getParent()->getNonTransparentContext()->lookup(Name);
0629     return std::distance(X.begin(), X.end()) ==
0630       std::distance(Y.begin(), Y.end());
0631   }
0632 
0633   /// Retrieve the anonymous namespace that inhabits this namespace, if any.
0634   NamespaceDecl *getAnonymousNamespace() const {
0635     return getFirstDecl()->AnonymousNamespace;
0636   }
0637 
0638   void setAnonymousNamespace(NamespaceDecl *D) {
0639     getFirstDecl()->AnonymousNamespace = D;
0640   }
0641 
0642   /// Retrieves the canonical declaration of this namespace.
0643   NamespaceDecl *getCanonicalDecl() override { return getFirstDecl(); }
0644   const NamespaceDecl *getCanonicalDecl() const { return getFirstDecl(); }
0645 
0646   SourceRange getSourceRange() const override LLVM_READONLY {
0647     return SourceRange(LocStart, RBraceLoc);
0648   }
0649 
0650   SourceLocation getBeginLoc() const LLVM_READONLY { return LocStart; }
0651   SourceLocation getRBraceLoc() const { return RBraceLoc; }
0652   void setLocStart(SourceLocation L) { LocStart = L; }
0653   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
0654 
0655   // Implement isa/cast/dyncast/etc.
0656   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0657   static bool classofKind(Kind K) { return K == Namespace; }
0658   static DeclContext *castToDeclContext(const NamespaceDecl *D) {
0659     return static_cast<DeclContext *>(const_cast<NamespaceDecl*>(D));
0660   }
0661   static NamespaceDecl *castFromDeclContext(const DeclContext *DC) {
0662     return static_cast<NamespaceDecl *>(const_cast<DeclContext*>(DC));
0663   }
0664 };
0665 
0666 class VarDecl;
0667 
0668 /// Represent the declaration of a variable (in which case it is
0669 /// an lvalue) a function (in which case it is a function designator) or
0670 /// an enum constant.
0671 class ValueDecl : public NamedDecl {
0672   QualType DeclType;
0673 
0674   void anchor() override;
0675 
0676 protected:
0677   ValueDecl(Kind DK, DeclContext *DC, SourceLocation L,
0678             DeclarationName N, QualType T)
0679     : NamedDecl(DK, DC, L, N), DeclType(T) {}
0680 
0681 public:
0682   QualType getType() const { return DeclType; }
0683   void setType(QualType newType) { DeclType = newType; }
0684 
0685   /// Determine whether this symbol is weakly-imported,
0686   ///        or declared with the weak or weak-ref attr.
0687   bool isWeak() const;
0688 
0689   /// Whether this variable is the implicit variable for a lambda init-capture.
0690   /// Only VarDecl can be init captures, but both VarDecl and BindingDecl
0691   /// can be captured.
0692   bool isInitCapture() const;
0693 
0694   // If this is a VarDecl, or a BindindDecl with an
0695   // associated decomposed VarDecl, return that VarDecl.
0696   VarDecl *getPotentiallyDecomposedVarDecl();
0697   const VarDecl *getPotentiallyDecomposedVarDecl() const {
0698     return const_cast<ValueDecl *>(this)->getPotentiallyDecomposedVarDecl();
0699   }
0700 
0701   // Implement isa/cast/dyncast/etc.
0702   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0703   static bool classofKind(Kind K) { return K >= firstValue && K <= lastValue; }
0704 };
0705 
0706 /// A struct with extended info about a syntactic
0707 /// name qualifier, to be used for the case of out-of-line declarations.
0708 struct QualifierInfo {
0709   NestedNameSpecifierLoc QualifierLoc;
0710 
0711   /// The number of "outer" template parameter lists.
0712   /// The count includes all of the template parameter lists that were matched
0713   /// against the template-ids occurring into the NNS and possibly (in the
0714   /// case of an explicit specialization) a final "template <>".
0715   unsigned NumTemplParamLists = 0;
0716 
0717   /// A new-allocated array of size NumTemplParamLists,
0718   /// containing pointers to the "outer" template parameter lists.
0719   /// It includes all of the template parameter lists that were matched
0720   /// against the template-ids occurring into the NNS and possibly (in the
0721   /// case of an explicit specialization) a final "template <>".
0722   TemplateParameterList** TemplParamLists = nullptr;
0723 
0724   QualifierInfo() = default;
0725   QualifierInfo(const QualifierInfo &) = delete;
0726   QualifierInfo& operator=(const QualifierInfo &) = delete;
0727 
0728   /// Sets info about "outer" template parameter lists.
0729   void setTemplateParameterListsInfo(ASTContext &Context,
0730                                      ArrayRef<TemplateParameterList *> TPLists);
0731 };
0732 
0733 /// Represents a ValueDecl that came out of a declarator.
0734 /// Contains type source information through TypeSourceInfo.
0735 class DeclaratorDecl : public ValueDecl {
0736   // A struct representing a TInfo, a trailing requires-clause and a syntactic
0737   // qualifier, to be used for the (uncommon) case of out-of-line declarations
0738   // and constrained function decls.
0739   struct ExtInfo : public QualifierInfo {
0740     TypeSourceInfo *TInfo = nullptr;
0741     Expr *TrailingRequiresClause = nullptr;
0742   };
0743 
0744   llvm::PointerUnion<TypeSourceInfo *, ExtInfo *> DeclInfo;
0745 
0746   /// The start of the source range for this declaration,
0747   /// ignoring outer template declarations.
0748   SourceLocation InnerLocStart;
0749 
0750   bool hasExtInfo() const { return isa<ExtInfo *>(DeclInfo); }
0751   ExtInfo *getExtInfo() { return cast<ExtInfo *>(DeclInfo); }
0752   const ExtInfo *getExtInfo() const { return cast<ExtInfo *>(DeclInfo); }
0753 
0754 protected:
0755   DeclaratorDecl(Kind DK, DeclContext *DC, SourceLocation L,
0756                  DeclarationName N, QualType T, TypeSourceInfo *TInfo,
0757                  SourceLocation StartL)
0758       : ValueDecl(DK, DC, L, N, T), DeclInfo(TInfo), InnerLocStart(StartL) {}
0759 
0760 public:
0761   friend class ASTDeclReader;
0762   friend class ASTDeclWriter;
0763 
0764   TypeSourceInfo *getTypeSourceInfo() const {
0765     return hasExtInfo() ? getExtInfo()->TInfo
0766                         : cast<TypeSourceInfo *>(DeclInfo);
0767   }
0768 
0769   void setTypeSourceInfo(TypeSourceInfo *TI) {
0770     if (hasExtInfo())
0771       getExtInfo()->TInfo = TI;
0772     else
0773       DeclInfo = TI;
0774   }
0775 
0776   /// Return start of source range ignoring outer template declarations.
0777   SourceLocation getInnerLocStart() const { return InnerLocStart; }
0778   void setInnerLocStart(SourceLocation L) { InnerLocStart = L; }
0779 
0780   /// Return start of source range taking into account any outer template
0781   /// declarations.
0782   SourceLocation getOuterLocStart() const;
0783 
0784   SourceRange getSourceRange() const override LLVM_READONLY;
0785 
0786   SourceLocation getBeginLoc() const LLVM_READONLY {
0787     return getOuterLocStart();
0788   }
0789 
0790   /// Retrieve the nested-name-specifier that qualifies the name of this
0791   /// declaration, if it was present in the source.
0792   NestedNameSpecifier *getQualifier() const {
0793     return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
0794                         : nullptr;
0795   }
0796 
0797   /// Retrieve the nested-name-specifier (with source-location
0798   /// information) that qualifies the name of this declaration, if it was
0799   /// present in the source.
0800   NestedNameSpecifierLoc getQualifierLoc() const {
0801     return hasExtInfo() ? getExtInfo()->QualifierLoc
0802                         : NestedNameSpecifierLoc();
0803   }
0804 
0805   void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc);
0806 
0807   /// \brief Get the constraint-expression introduced by the trailing
0808   /// requires-clause in the function/member declaration, or null if no
0809   /// requires-clause was provided.
0810   Expr *getTrailingRequiresClause() {
0811     return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
0812                         : nullptr;
0813   }
0814 
0815   const Expr *getTrailingRequiresClause() const {
0816     return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
0817                         : nullptr;
0818   }
0819 
0820   void setTrailingRequiresClause(Expr *TrailingRequiresClause);
0821 
0822   unsigned getNumTemplateParameterLists() const {
0823     return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
0824   }
0825 
0826   TemplateParameterList *getTemplateParameterList(unsigned index) const {
0827     assert(index < getNumTemplateParameterLists());
0828     return getExtInfo()->TemplParamLists[index];
0829   }
0830 
0831   void setTemplateParameterListsInfo(ASTContext &Context,
0832                                      ArrayRef<TemplateParameterList *> TPLists);
0833 
0834   SourceLocation getTypeSpecStartLoc() const;
0835   SourceLocation getTypeSpecEndLoc() const;
0836 
0837   // Implement isa/cast/dyncast/etc.
0838   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
0839   static bool classofKind(Kind K) {
0840     return K >= firstDeclarator && K <= lastDeclarator;
0841   }
0842 };
0843 
0844 /// Structure used to store a statement, the constant value to
0845 /// which it was evaluated (if any), and whether or not the statement
0846 /// is an integral constant expression (if known).
0847 struct EvaluatedStmt {
0848   /// Whether this statement was already evaluated.
0849   bool WasEvaluated : 1;
0850 
0851   /// Whether this statement is being evaluated.
0852   bool IsEvaluating : 1;
0853 
0854   /// Whether this variable is known to have constant initialization. This is
0855   /// currently only computed in C++, for static / thread storage duration
0856   /// variables that might have constant initialization and for variables that
0857   /// are usable in constant expressions.
0858   bool HasConstantInitialization : 1;
0859 
0860   /// Whether this variable is known to have constant destruction. That is,
0861   /// whether running the destructor on the initial value is a side-effect
0862   /// (and doesn't inspect any state that might have changed during program
0863   /// execution). This is currently only computed if the destructor is
0864   /// non-trivial.
0865   bool HasConstantDestruction : 1;
0866 
0867   /// In C++98, whether the initializer is an ICE. This affects whether the
0868   /// variable is usable in constant expressions.
0869   bool HasICEInit : 1;
0870   bool CheckedForICEInit : 1;
0871 
0872   LazyDeclStmtPtr Value;
0873   APValue Evaluated;
0874 
0875   EvaluatedStmt()
0876       : WasEvaluated(false), IsEvaluating(false),
0877         HasConstantInitialization(false), HasConstantDestruction(false),
0878         HasICEInit(false), CheckedForICEInit(false) {}
0879 };
0880 
0881 /// Represents a variable declaration or definition.
0882 class VarDecl : public DeclaratorDecl, public Redeclarable<VarDecl> {
0883 public:
0884   /// Initialization styles.
0885   enum InitializationStyle {
0886     /// C-style initialization with assignment
0887     CInit,
0888 
0889     /// Call-style initialization (C++98)
0890     CallInit,
0891 
0892     /// Direct list-initialization (C++11)
0893     ListInit,
0894 
0895     /// Parenthesized list-initialization (C++20)
0896     ParenListInit
0897   };
0898 
0899   /// Kinds of thread-local storage.
0900   enum TLSKind {
0901     /// Not a TLS variable.
0902     TLS_None,
0903 
0904     /// TLS with a known-constant initializer.
0905     TLS_Static,
0906 
0907     /// TLS with a dynamic initializer.
0908     TLS_Dynamic
0909   };
0910 
0911   /// Return the string used to specify the storage class \p SC.
0912   ///
0913   /// It is illegal to call this function with SC == None.
0914   static const char *getStorageClassSpecifierString(StorageClass SC);
0915 
0916 protected:
0917   // A pointer union of Stmt * and EvaluatedStmt *. When an EvaluatedStmt, we
0918   // have allocated the auxiliary struct of information there.
0919   //
0920   // TODO: It is a bit unfortunate to use a PointerUnion inside the VarDecl for
0921   // this as *many* VarDecls are ParmVarDecls that don't have default
0922   // arguments. We could save some space by moving this pointer union to be
0923   // allocated in trailing space when necessary.
0924   using InitType = llvm::PointerUnion<Stmt *, EvaluatedStmt *>;
0925 
0926   /// The initializer for this variable or, for a ParmVarDecl, the
0927   /// C++ default argument.
0928   mutable InitType Init;
0929 
0930 private:
0931   friend class ASTDeclReader;
0932   friend class ASTNodeImporter;
0933   friend class StmtIteratorBase;
0934 
0935   class VarDeclBitfields {
0936     friend class ASTDeclReader;
0937     friend class VarDecl;
0938 
0939     LLVM_PREFERRED_TYPE(StorageClass)
0940     unsigned SClass : 3;
0941     LLVM_PREFERRED_TYPE(ThreadStorageClassSpecifier)
0942     unsigned TSCSpec : 2;
0943     LLVM_PREFERRED_TYPE(InitializationStyle)
0944     unsigned InitStyle : 2;
0945 
0946     /// Whether this variable is an ARC pseudo-__strong variable; see
0947     /// isARCPseudoStrong() for details.
0948     LLVM_PREFERRED_TYPE(bool)
0949     unsigned ARCPseudoStrong : 1;
0950   };
0951   enum { NumVarDeclBits = 8 };
0952 
0953 protected:
0954   enum { NumParameterIndexBits = 8 };
0955 
0956   enum DefaultArgKind {
0957     DAK_None,
0958     DAK_Unparsed,
0959     DAK_Uninstantiated,
0960     DAK_Normal
0961   };
0962 
0963   enum { NumScopeDepthOrObjCQualsBits = 7 };
0964 
0965   class ParmVarDeclBitfields {
0966     friend class ASTDeclReader;
0967     friend class ParmVarDecl;
0968 
0969     LLVM_PREFERRED_TYPE(VarDeclBitfields)
0970     unsigned : NumVarDeclBits;
0971 
0972     /// Whether this parameter inherits a default argument from a
0973     /// prior declaration.
0974     LLVM_PREFERRED_TYPE(bool)
0975     unsigned HasInheritedDefaultArg : 1;
0976 
0977     /// Describes the kind of default argument for this parameter. By default
0978     /// this is none. If this is normal, then the default argument is stored in
0979     /// the \c VarDecl initializer expression unless we were unable to parse
0980     /// (even an invalid) expression for the default argument.
0981     LLVM_PREFERRED_TYPE(DefaultArgKind)
0982     unsigned DefaultArgKind : 2;
0983 
0984     /// Whether this parameter undergoes K&R argument promotion.
0985     LLVM_PREFERRED_TYPE(bool)
0986     unsigned IsKNRPromoted : 1;
0987 
0988     /// Whether this parameter is an ObjC method parameter or not.
0989     LLVM_PREFERRED_TYPE(bool)
0990     unsigned IsObjCMethodParam : 1;
0991 
0992     /// If IsObjCMethodParam, a Decl::ObjCDeclQualifier.
0993     /// Otherwise, the number of function parameter scopes enclosing
0994     /// the function parameter scope in which this parameter was
0995     /// declared.
0996     unsigned ScopeDepthOrObjCQuals : NumScopeDepthOrObjCQualsBits;
0997 
0998     /// The number of parameters preceding this parameter in the
0999     /// function parameter scope in which it was declared.
1000     unsigned ParameterIndex : NumParameterIndexBits;
1001   };
1002 
1003   class NonParmVarDeclBitfields {
1004     friend class ASTDeclReader;
1005     friend class ImplicitParamDecl;
1006     friend class VarDecl;
1007 
1008     LLVM_PREFERRED_TYPE(VarDeclBitfields)
1009     unsigned : NumVarDeclBits;
1010 
1011     // FIXME: We need something similar to CXXRecordDecl::DefinitionData.
1012     /// Whether this variable is a definition which was demoted due to
1013     /// module merge.
1014     LLVM_PREFERRED_TYPE(bool)
1015     unsigned IsThisDeclarationADemotedDefinition : 1;
1016 
1017     /// Whether this variable is the exception variable in a C++ catch
1018     /// or an Objective-C @catch statement.
1019     LLVM_PREFERRED_TYPE(bool)
1020     unsigned ExceptionVar : 1;
1021 
1022     /// Whether this local variable could be allocated in the return
1023     /// slot of its function, enabling the named return value optimization
1024     /// (NRVO).
1025     LLVM_PREFERRED_TYPE(bool)
1026     unsigned NRVOVariable : 1;
1027 
1028     /// Whether this variable is the for-range-declaration in a C++0x
1029     /// for-range statement.
1030     LLVM_PREFERRED_TYPE(bool)
1031     unsigned CXXForRangeDecl : 1;
1032 
1033     /// Whether this variable is the for-in loop declaration in Objective-C.
1034     LLVM_PREFERRED_TYPE(bool)
1035     unsigned ObjCForDecl : 1;
1036 
1037     /// Whether this variable is (C++1z) inline.
1038     LLVM_PREFERRED_TYPE(bool)
1039     unsigned IsInline : 1;
1040 
1041     /// Whether this variable has (C++1z) inline explicitly specified.
1042     LLVM_PREFERRED_TYPE(bool)
1043     unsigned IsInlineSpecified : 1;
1044 
1045     /// Whether this variable is (C++0x) constexpr.
1046     LLVM_PREFERRED_TYPE(bool)
1047     unsigned IsConstexpr : 1;
1048 
1049     /// Whether this variable is the implicit variable for a lambda
1050     /// init-capture.
1051     LLVM_PREFERRED_TYPE(bool)
1052     unsigned IsInitCapture : 1;
1053 
1054     /// Whether this local extern variable's previous declaration was
1055     /// declared in the same block scope. This controls whether we should merge
1056     /// the type of this declaration with its previous declaration.
1057     LLVM_PREFERRED_TYPE(bool)
1058     unsigned PreviousDeclInSameBlockScope : 1;
1059 
1060     /// Defines kind of the ImplicitParamDecl: 'this', 'self', 'vtt', '_cmd' or
1061     /// something else.
1062     LLVM_PREFERRED_TYPE(ImplicitParamKind)
1063     unsigned ImplicitParamKind : 3;
1064 
1065     LLVM_PREFERRED_TYPE(bool)
1066     unsigned EscapingByref : 1;
1067 
1068     LLVM_PREFERRED_TYPE(bool)
1069     unsigned IsCXXCondDecl : 1;
1070   };
1071 
1072   union {
1073     unsigned AllBits;
1074     VarDeclBitfields VarDeclBits;
1075     ParmVarDeclBitfields ParmVarDeclBits;
1076     NonParmVarDeclBitfields NonParmVarDeclBits;
1077   };
1078 
1079   VarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
1080           SourceLocation IdLoc, const IdentifierInfo *Id, QualType T,
1081           TypeSourceInfo *TInfo, StorageClass SC);
1082 
1083   using redeclarable_base = Redeclarable<VarDecl>;
1084 
1085   VarDecl *getNextRedeclarationImpl() override {
1086     return getNextRedeclaration();
1087   }
1088 
1089   VarDecl *getPreviousDeclImpl() override {
1090     return getPreviousDecl();
1091   }
1092 
1093   VarDecl *getMostRecentDeclImpl() override {
1094     return getMostRecentDecl();
1095   }
1096 
1097 public:
1098   using redecl_range = redeclarable_base::redecl_range;
1099   using redecl_iterator = redeclarable_base::redecl_iterator;
1100 
1101   using redeclarable_base::redecls_begin;
1102   using redeclarable_base::redecls_end;
1103   using redeclarable_base::redecls;
1104   using redeclarable_base::getPreviousDecl;
1105   using redeclarable_base::getMostRecentDecl;
1106   using redeclarable_base::isFirstDecl;
1107 
1108   static VarDecl *Create(ASTContext &C, DeclContext *DC,
1109                          SourceLocation StartLoc, SourceLocation IdLoc,
1110                          const IdentifierInfo *Id, QualType T,
1111                          TypeSourceInfo *TInfo, StorageClass S);
1112 
1113   static VarDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
1114 
1115   SourceRange getSourceRange() const override LLVM_READONLY;
1116 
1117   /// Returns the storage class as written in the source. For the
1118   /// computed linkage of symbol, see getLinkage.
1119   StorageClass getStorageClass() const {
1120     return (StorageClass) VarDeclBits.SClass;
1121   }
1122   void setStorageClass(StorageClass SC);
1123 
1124   void setTSCSpec(ThreadStorageClassSpecifier TSC) {
1125     VarDeclBits.TSCSpec = TSC;
1126     assert(VarDeclBits.TSCSpec == TSC && "truncation");
1127   }
1128   ThreadStorageClassSpecifier getTSCSpec() const {
1129     return static_cast<ThreadStorageClassSpecifier>(VarDeclBits.TSCSpec);
1130   }
1131   TLSKind getTLSKind() const;
1132 
1133   /// Returns true if a variable with function scope is a non-static local
1134   /// variable.
1135   bool hasLocalStorage() const {
1136     if (getStorageClass() == SC_None) {
1137       // OpenCL v1.2 s6.5.3: The __constant or constant address space name is
1138       // used to describe variables allocated in global memory and which are
1139       // accessed inside a kernel(s) as read-only variables. As such, variables
1140       // in constant address space cannot have local storage.
1141       if (getType().getAddressSpace() == LangAS::opencl_constant)
1142         return false;
1143       // Second check is for C++11 [dcl.stc]p4.
1144       return !isFileVarDecl() && getTSCSpec() == TSCS_unspecified;
1145     }
1146 
1147     // Global Named Register (GNU extension)
1148     if (getStorageClass() == SC_Register && !isLocalVarDeclOrParm())
1149       return false;
1150 
1151     // Return true for:  Auto, Register.
1152     // Return false for: Extern, Static, PrivateExtern, OpenCLWorkGroupLocal.
1153 
1154     return getStorageClass() >= SC_Auto;
1155   }
1156 
1157   /// Returns true if a variable with function scope is a static local
1158   /// variable.
1159   bool isStaticLocal() const {
1160     return (getStorageClass() == SC_Static ||
1161             // C++11 [dcl.stc]p4
1162             (getStorageClass() == SC_None && getTSCSpec() == TSCS_thread_local))
1163       && !isFileVarDecl();
1164   }
1165 
1166   /// Returns true if a variable has extern or __private_extern__
1167   /// storage.
1168   bool hasExternalStorage() const {
1169     return getStorageClass() == SC_Extern ||
1170            getStorageClass() == SC_PrivateExtern;
1171   }
1172 
1173   /// Returns true for all variables that do not have local storage.
1174   ///
1175   /// This includes all global variables as well as static variables declared
1176   /// within a function.
1177   bool hasGlobalStorage() const { return !hasLocalStorage(); }
1178 
1179   /// Get the storage duration of this variable, per C++ [basic.stc].
1180   StorageDuration getStorageDuration() const {
1181     return hasLocalStorage() ? SD_Automatic :
1182            getTSCSpec() ? SD_Thread : SD_Static;
1183   }
1184 
1185   /// Compute the language linkage.
1186   LanguageLinkage getLanguageLinkage() const;
1187 
1188   /// Determines whether this variable is a variable with external, C linkage.
1189   bool isExternC() const;
1190 
1191   /// Determines whether this variable's context is, or is nested within,
1192   /// a C++ extern "C" linkage spec.
1193   bool isInExternCContext() const;
1194 
1195   /// Determines whether this variable's context is, or is nested within,
1196   /// a C++ extern "C++" linkage spec.
1197   bool isInExternCXXContext() const;
1198 
1199   /// Returns true for local variable declarations other than parameters.
1200   /// Note that this includes static variables inside of functions. It also
1201   /// includes variables inside blocks.
1202   ///
1203   ///   void foo() { int x; static int y; extern int z; }
1204   bool isLocalVarDecl() const {
1205     if (getKind() != Decl::Var && getKind() != Decl::Decomposition)
1206       return false;
1207     if (const DeclContext *DC = getLexicalDeclContext())
1208       return DC->getRedeclContext()->isFunctionOrMethod();
1209     return false;
1210   }
1211 
1212   /// Similar to isLocalVarDecl but also includes parameters.
1213   bool isLocalVarDeclOrParm() const {
1214     return isLocalVarDecl() || getKind() == Decl::ParmVar;
1215   }
1216 
1217   /// Similar to isLocalVarDecl, but excludes variables declared in blocks.
1218   bool isFunctionOrMethodVarDecl() const {
1219     if (getKind() != Decl::Var && getKind() != Decl::Decomposition)
1220       return false;
1221     const DeclContext *DC = getLexicalDeclContext()->getRedeclContext();
1222     return DC->isFunctionOrMethod() && DC->getDeclKind() != Decl::Block;
1223   }
1224 
1225   /// Determines whether this is a static data member.
1226   ///
1227   /// This will only be true in C++, and applies to, e.g., the
1228   /// variable 'x' in:
1229   /// \code
1230   /// struct S {
1231   ///   static int x;
1232   /// };
1233   /// \endcode
1234   bool isStaticDataMember() const {
1235     // If it wasn't static, it would be a FieldDecl.
1236     return getKind() != Decl::ParmVar && getDeclContext()->isRecord();
1237   }
1238 
1239   VarDecl *getCanonicalDecl() override;
1240   const VarDecl *getCanonicalDecl() const {
1241     return const_cast<VarDecl*>(this)->getCanonicalDecl();
1242   }
1243 
1244   enum DefinitionKind {
1245     /// This declaration is only a declaration.
1246     DeclarationOnly,
1247 
1248     /// This declaration is a tentative definition.
1249     TentativeDefinition,
1250 
1251     /// This declaration is definitely a definition.
1252     Definition
1253   };
1254 
1255   /// Check whether this declaration is a definition. If this could be
1256   /// a tentative definition (in C), don't check whether there's an overriding
1257   /// definition.
1258   DefinitionKind isThisDeclarationADefinition(ASTContext &) const;
1259   DefinitionKind isThisDeclarationADefinition() const {
1260     return isThisDeclarationADefinition(getASTContext());
1261   }
1262 
1263   /// Check whether this variable is defined in this translation unit.
1264   DefinitionKind hasDefinition(ASTContext &) const;
1265   DefinitionKind hasDefinition() const {
1266     return hasDefinition(getASTContext());
1267   }
1268 
1269   /// Get the tentative definition that acts as the real definition in a TU.
1270   /// Returns null if there is a proper definition available.
1271   VarDecl *getActingDefinition();
1272   const VarDecl *getActingDefinition() const {
1273     return const_cast<VarDecl*>(this)->getActingDefinition();
1274   }
1275 
1276   /// Get the real (not just tentative) definition for this declaration.
1277   VarDecl *getDefinition(ASTContext &);
1278   const VarDecl *getDefinition(ASTContext &C) const {
1279     return const_cast<VarDecl*>(this)->getDefinition(C);
1280   }
1281   VarDecl *getDefinition() {
1282     return getDefinition(getASTContext());
1283   }
1284   const VarDecl *getDefinition() const {
1285     return const_cast<VarDecl*>(this)->getDefinition();
1286   }
1287 
1288   /// Determine whether this is or was instantiated from an out-of-line
1289   /// definition of a static data member.
1290   bool isOutOfLine() const override;
1291 
1292   /// Returns true for file scoped variable declaration.
1293   bool isFileVarDecl() const {
1294     Kind K = getKind();
1295     if (K == ParmVar || K == ImplicitParam)
1296       return false;
1297 
1298     if (getLexicalDeclContext()->getRedeclContext()->isFileContext())
1299       return true;
1300 
1301     if (isStaticDataMember())
1302       return true;
1303 
1304     return false;
1305   }
1306 
1307   /// Get the initializer for this variable, no matter which
1308   /// declaration it is attached to.
1309   const Expr *getAnyInitializer() const {
1310     const VarDecl *D;
1311     return getAnyInitializer(D);
1312   }
1313 
1314   /// Get the initializer for this variable, no matter which
1315   /// declaration it is attached to. Also get that declaration.
1316   const Expr *getAnyInitializer(const VarDecl *&D) const;
1317 
1318   bool hasInit() const;
1319   const Expr *getInit() const {
1320     return const_cast<VarDecl *>(this)->getInit();
1321   }
1322   Expr *getInit();
1323 
1324   /// Retrieve the address of the initializer expression.
1325   Stmt **getInitAddress();
1326 
1327   void setInit(Expr *I);
1328 
1329   /// Get the initializing declaration of this variable, if any. This is
1330   /// usually the definition, except that for a static data member it can be
1331   /// the in-class declaration.
1332   VarDecl *getInitializingDeclaration();
1333   const VarDecl *getInitializingDeclaration() const {
1334     return const_cast<VarDecl *>(this)->getInitializingDeclaration();
1335   }
1336 
1337   /// Determine whether this variable's value might be usable in a
1338   /// constant expression, according to the relevant language standard.
1339   /// This only checks properties of the declaration, and does not check
1340   /// whether the initializer is in fact a constant expression.
1341   ///
1342   /// This corresponds to C++20 [expr.const]p3's notion of a
1343   /// "potentially-constant" variable.
1344   bool mightBeUsableInConstantExpressions(const ASTContext &C) const;
1345 
1346   /// Determine whether this variable's value can be used in a
1347   /// constant expression, according to the relevant language standard,
1348   /// including checking whether it was initialized by a constant expression.
1349   bool isUsableInConstantExpressions(const ASTContext &C) const;
1350 
1351   EvaluatedStmt *ensureEvaluatedStmt() const;
1352   EvaluatedStmt *getEvaluatedStmt() const;
1353 
1354   /// Attempt to evaluate the value of the initializer attached to this
1355   /// declaration, and produce notes explaining why it cannot be evaluated.
1356   /// Returns a pointer to the value if evaluation succeeded, 0 otherwise.
1357   APValue *evaluateValue() const;
1358 
1359 private:
1360   APValue *evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
1361                              bool IsConstantInitialization) const;
1362 
1363 public:
1364   /// Return the already-evaluated value of this variable's
1365   /// initializer, or NULL if the value is not yet known. Returns pointer
1366   /// to untyped APValue if the value could not be evaluated.
1367   APValue *getEvaluatedValue() const;
1368 
1369   /// Evaluate the destruction of this variable to determine if it constitutes
1370   /// constant destruction.
1371   ///
1372   /// \pre hasConstantInitialization()
1373   /// \return \c true if this variable has constant destruction, \c false if
1374   ///         not.
1375   bool evaluateDestruction(SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
1376 
1377   /// Determine whether this variable has constant initialization.
1378   ///
1379   /// This is only set in two cases: when the language semantics require
1380   /// constant initialization (globals in C and some globals in C++), and when
1381   /// the variable is usable in constant expressions (constexpr, const int, and
1382   /// reference variables in C++).
1383   bool hasConstantInitialization() const;
1384 
1385   /// Determine whether the initializer of this variable is an integer constant
1386   /// expression. For use in C++98, where this affects whether the variable is
1387   /// usable in constant expressions.
1388   bool hasICEInitializer(const ASTContext &Context) const;
1389 
1390   /// Evaluate the initializer of this variable to determine whether it's a
1391   /// constant initializer. Should only be called once, after completing the
1392   /// definition of the variable.
1393   bool checkForConstantInitialization(
1394       SmallVectorImpl<PartialDiagnosticAt> &Notes) const;
1395 
1396   void setInitStyle(InitializationStyle Style) {
1397     VarDeclBits.InitStyle = Style;
1398   }
1399 
1400   /// The style of initialization for this declaration.
1401   ///
1402   /// C-style initialization is "int x = 1;". Call-style initialization is
1403   /// a C++98 direct-initializer, e.g. "int x(1);". The Init expression will be
1404   /// the expression inside the parens or a "ClassType(a,b,c)" class constructor
1405   /// expression for class types. List-style initialization is C++11 syntax,
1406   /// e.g. "int x{1};". Clients can distinguish between different forms of
1407   /// initialization by checking this value. In particular, "int x = {1};" is
1408   /// C-style, "int x({1})" is call-style, and "int x{1};" is list-style; the
1409   /// Init expression in all three cases is an InitListExpr.
1410   InitializationStyle getInitStyle() const {
1411     return static_cast<InitializationStyle>(VarDeclBits.InitStyle);
1412   }
1413 
1414   /// Whether the initializer is a direct-initializer (list or call).
1415   bool isDirectInit() const {
1416     return getInitStyle() != CInit;
1417   }
1418 
1419   /// If this definition should pretend to be a declaration.
1420   bool isThisDeclarationADemotedDefinition() const {
1421     return isa<ParmVarDecl>(this) ? false :
1422       NonParmVarDeclBits.IsThisDeclarationADemotedDefinition;
1423   }
1424 
1425   /// This is a definition which should be demoted to a declaration.
1426   ///
1427   /// In some cases (mostly module merging) we can end up with two visible
1428   /// definitions one of which needs to be demoted to a declaration to keep
1429   /// the AST invariants.
1430   void demoteThisDefinitionToDeclaration() {
1431     assert(isThisDeclarationADefinition() && "Not a definition!");
1432     assert(!isa<ParmVarDecl>(this) && "Cannot demote ParmVarDecls!");
1433     NonParmVarDeclBits.IsThisDeclarationADemotedDefinition = 1;
1434   }
1435 
1436   /// Determine whether this variable is the exception variable in a
1437   /// C++ catch statememt or an Objective-C \@catch statement.
1438   bool isExceptionVariable() const {
1439     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.ExceptionVar;
1440   }
1441   void setExceptionVariable(bool EV) {
1442     assert(!isa<ParmVarDecl>(this));
1443     NonParmVarDeclBits.ExceptionVar = EV;
1444   }
1445 
1446   /// Determine whether this local variable can be used with the named
1447   /// return value optimization (NRVO).
1448   ///
1449   /// The named return value optimization (NRVO) works by marking certain
1450   /// non-volatile local variables of class type as NRVO objects. These
1451   /// locals can be allocated within the return slot of their containing
1452   /// function, in which case there is no need to copy the object to the
1453   /// return slot when returning from the function. Within the function body,
1454   /// each return that returns the NRVO object will have this variable as its
1455   /// NRVO candidate.
1456   bool isNRVOVariable() const {
1457     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.NRVOVariable;
1458   }
1459   void setNRVOVariable(bool NRVO) {
1460     assert(!isa<ParmVarDecl>(this));
1461     NonParmVarDeclBits.NRVOVariable = NRVO;
1462   }
1463 
1464   /// Determine whether this variable is the for-range-declaration in
1465   /// a C++0x for-range statement.
1466   bool isCXXForRangeDecl() const {
1467     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.CXXForRangeDecl;
1468   }
1469   void setCXXForRangeDecl(bool FRD) {
1470     assert(!isa<ParmVarDecl>(this));
1471     NonParmVarDeclBits.CXXForRangeDecl = FRD;
1472   }
1473 
1474   /// Determine whether this variable is a for-loop declaration for a
1475   /// for-in statement in Objective-C.
1476   bool isObjCForDecl() const {
1477     return NonParmVarDeclBits.ObjCForDecl;
1478   }
1479 
1480   void setObjCForDecl(bool FRD) {
1481     NonParmVarDeclBits.ObjCForDecl = FRD;
1482   }
1483 
1484   /// Determine whether this variable is an ARC pseudo-__strong variable. A
1485   /// pseudo-__strong variable has a __strong-qualified type but does not
1486   /// actually retain the object written into it. Generally such variables are
1487   /// also 'const' for safety. There are 3 cases where this will be set, 1) if
1488   /// the variable is annotated with the objc_externally_retained attribute, 2)
1489   /// if its 'self' in a non-init method, or 3) if its the variable in an for-in
1490   /// loop.
1491   bool isARCPseudoStrong() const { return VarDeclBits.ARCPseudoStrong; }
1492   void setARCPseudoStrong(bool PS) { VarDeclBits.ARCPseudoStrong = PS; }
1493 
1494   /// Whether this variable is (C++1z) inline.
1495   bool isInline() const {
1496     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInline;
1497   }
1498   bool isInlineSpecified() const {
1499     return isa<ParmVarDecl>(this) ? false
1500                                   : NonParmVarDeclBits.IsInlineSpecified;
1501   }
1502   void setInlineSpecified() {
1503     assert(!isa<ParmVarDecl>(this));
1504     NonParmVarDeclBits.IsInline = true;
1505     NonParmVarDeclBits.IsInlineSpecified = true;
1506   }
1507   void setImplicitlyInline() {
1508     assert(!isa<ParmVarDecl>(this));
1509     NonParmVarDeclBits.IsInline = true;
1510   }
1511 
1512   /// Whether this variable is (C++11) constexpr.
1513   bool isConstexpr() const {
1514     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsConstexpr;
1515   }
1516   void setConstexpr(bool IC) {
1517     assert(!isa<ParmVarDecl>(this));
1518     NonParmVarDeclBits.IsConstexpr = IC;
1519   }
1520 
1521   /// Whether this variable is the implicit variable for a lambda init-capture.
1522   bool isInitCapture() const {
1523     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInitCapture;
1524   }
1525   void setInitCapture(bool IC) {
1526     assert(!isa<ParmVarDecl>(this));
1527     NonParmVarDeclBits.IsInitCapture = IC;
1528   }
1529 
1530   /// Determine whether this variable is actually a function parameter pack or
1531   /// init-capture pack.
1532   bool isParameterPack() const;
1533 
1534   /// Whether this local extern variable declaration's previous declaration
1535   /// was declared in the same block scope. Only correct in C++.
1536   bool isPreviousDeclInSameBlockScope() const {
1537     return isa<ParmVarDecl>(this)
1538                ? false
1539                : NonParmVarDeclBits.PreviousDeclInSameBlockScope;
1540   }
1541   void setPreviousDeclInSameBlockScope(bool Same) {
1542     assert(!isa<ParmVarDecl>(this));
1543     NonParmVarDeclBits.PreviousDeclInSameBlockScope = Same;
1544   }
1545 
1546   /// Indicates the capture is a __block variable that is captured by a block
1547   /// that can potentially escape (a block for which BlockDecl::doesNotEscape
1548   /// returns false).
1549   bool isEscapingByref() const;
1550 
1551   /// Indicates the capture is a __block variable that is never captured by an
1552   /// escaping block.
1553   bool isNonEscapingByref() const;
1554 
1555   void setEscapingByref() {
1556     NonParmVarDeclBits.EscapingByref = true;
1557   }
1558 
1559   bool isCXXCondDecl() const {
1560     return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsCXXCondDecl;
1561   }
1562 
1563   void setCXXCondDecl() {
1564     assert(!isa<ParmVarDecl>(this));
1565     NonParmVarDeclBits.IsCXXCondDecl = true;
1566   }
1567 
1568   /// Determines if this variable's alignment is dependent.
1569   bool hasDependentAlignment() const;
1570 
1571   /// Retrieve the variable declaration from which this variable could
1572   /// be instantiated, if it is an instantiation (rather than a non-template).
1573   VarDecl *getTemplateInstantiationPattern() const;
1574 
1575   /// If this variable is an instantiated static data member of a
1576   /// class template specialization, returns the templated static data member
1577   /// from which it was instantiated.
1578   VarDecl *getInstantiatedFromStaticDataMember() const;
1579 
1580   /// If this variable is an instantiation of a variable template or a
1581   /// static data member of a class template, determine what kind of
1582   /// template specialization or instantiation this is.
1583   TemplateSpecializationKind getTemplateSpecializationKind() const;
1584 
1585   /// Get the template specialization kind of this variable for the purposes of
1586   /// template instantiation. This differs from getTemplateSpecializationKind()
1587   /// for an instantiation of a class-scope explicit specialization.
1588   TemplateSpecializationKind
1589   getTemplateSpecializationKindForInstantiation() const;
1590 
1591   /// If this variable is an instantiation of a variable template or a
1592   /// static data member of a class template, determine its point of
1593   /// instantiation.
1594   SourceLocation getPointOfInstantiation() const;
1595 
1596   /// If this variable is an instantiation of a static data member of a
1597   /// class template specialization, retrieves the member specialization
1598   /// information.
1599   MemberSpecializationInfo *getMemberSpecializationInfo() const;
1600 
1601   /// For a static data member that was instantiated from a static
1602   /// data member of a class template, set the template specialiation kind.
1603   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
1604                         SourceLocation PointOfInstantiation = SourceLocation());
1605 
1606   /// Specify that this variable is an instantiation of the
1607   /// static data member VD.
1608   void setInstantiationOfStaticDataMember(VarDecl *VD,
1609                                           TemplateSpecializationKind TSK);
1610 
1611   /// Retrieves the variable template that is described by this
1612   /// variable declaration.
1613   ///
1614   /// Every variable template is represented as a VarTemplateDecl and a
1615   /// VarDecl. The former contains template properties (such as
1616   /// the template parameter lists) while the latter contains the
1617   /// actual description of the template's
1618   /// contents. VarTemplateDecl::getTemplatedDecl() retrieves the
1619   /// VarDecl that from a VarTemplateDecl, while
1620   /// getDescribedVarTemplate() retrieves the VarTemplateDecl from
1621   /// a VarDecl.
1622   VarTemplateDecl *getDescribedVarTemplate() const;
1623 
1624   void setDescribedVarTemplate(VarTemplateDecl *Template);
1625 
1626   // Is this variable known to have a definition somewhere in the complete
1627   // program? This may be true even if the declaration has internal linkage and
1628   // has no definition within this source file.
1629   bool isKnownToBeDefined() const;
1630 
1631   /// Is destruction of this variable entirely suppressed? If so, the variable
1632   /// need not have a usable destructor at all.
1633   bool isNoDestroy(const ASTContext &) const;
1634 
1635   /// Would the destruction of this variable have any effect, and if so, what
1636   /// kind?
1637   QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const;
1638 
1639   /// Whether this variable has a flexible array member initialized with one
1640   /// or more elements. This can only be called for declarations where
1641   /// hasInit() is true.
1642   ///
1643   /// (The standard doesn't allow initializing flexible array members; this is
1644   /// a gcc/msvc extension.)
1645   bool hasFlexibleArrayInit(const ASTContext &Ctx) const;
1646 
1647   /// If hasFlexibleArrayInit is true, compute the number of additional bytes
1648   /// necessary to store those elements. Otherwise, returns zero.
1649   ///
1650   /// This can only be called for declarations where hasInit() is true.
1651   CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const;
1652 
1653   // Implement isa/cast/dyncast/etc.
1654   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1655   static bool classofKind(Kind K) { return K >= firstVar && K <= lastVar; }
1656 };
1657 
1658 /// Defines the kind of the implicit parameter: is this an implicit parameter
1659 /// with pointer to 'this', 'self', '_cmd', virtual table pointers, captured
1660 /// context or something else.
1661 enum class ImplicitParamKind {
1662   /// Parameter for Objective-C 'self' argument
1663   ObjCSelf,
1664 
1665   /// Parameter for Objective-C '_cmd' argument
1666   ObjCCmd,
1667 
1668   /// Parameter for C++ 'this' argument
1669   CXXThis,
1670 
1671   /// Parameter for C++ virtual table pointers
1672   CXXVTT,
1673 
1674   /// Parameter for captured context
1675   CapturedContext,
1676 
1677   /// Parameter for Thread private variable
1678   ThreadPrivateVar,
1679 
1680   /// Other implicit parameter
1681   Other,
1682 };
1683 
1684 class ImplicitParamDecl : public VarDecl {
1685   void anchor() override;
1686 
1687 public:
1688   /// Create implicit parameter.
1689   static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC,
1690                                    SourceLocation IdLoc, IdentifierInfo *Id,
1691                                    QualType T, ImplicitParamKind ParamKind);
1692   static ImplicitParamDecl *Create(ASTContext &C, QualType T,
1693                                    ImplicitParamKind ParamKind);
1694 
1695   static ImplicitParamDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
1696 
1697   ImplicitParamDecl(ASTContext &C, DeclContext *DC, SourceLocation IdLoc,
1698                     const IdentifierInfo *Id, QualType Type,
1699                     ImplicitParamKind ParamKind)
1700       : VarDecl(ImplicitParam, C, DC, IdLoc, IdLoc, Id, Type,
1701                 /*TInfo=*/nullptr, SC_None) {
1702     NonParmVarDeclBits.ImplicitParamKind = llvm::to_underlying(ParamKind);
1703     setImplicit();
1704   }
1705 
1706   ImplicitParamDecl(ASTContext &C, QualType Type, ImplicitParamKind ParamKind)
1707       : VarDecl(ImplicitParam, C, /*DC=*/nullptr, SourceLocation(),
1708                 SourceLocation(), /*Id=*/nullptr, Type,
1709                 /*TInfo=*/nullptr, SC_None) {
1710     NonParmVarDeclBits.ImplicitParamKind = llvm::to_underlying(ParamKind);
1711     setImplicit();
1712   }
1713 
1714   /// Returns the implicit parameter kind.
1715   ImplicitParamKind getParameterKind() const {
1716     return static_cast<ImplicitParamKind>(NonParmVarDeclBits.ImplicitParamKind);
1717   }
1718 
1719   // Implement isa/cast/dyncast/etc.
1720   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1721   static bool classofKind(Kind K) { return K == ImplicitParam; }
1722 };
1723 
1724 /// Represents a parameter to a function.
1725 class ParmVarDecl : public VarDecl {
1726 public:
1727   enum { MaxFunctionScopeDepth = 255 };
1728   enum { MaxFunctionScopeIndex = 255 };
1729 
1730 protected:
1731   ParmVarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
1732               SourceLocation IdLoc, const IdentifierInfo *Id, QualType T,
1733               TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
1734       : VarDecl(DK, C, DC, StartLoc, IdLoc, Id, T, TInfo, S) {
1735     assert(ParmVarDeclBits.HasInheritedDefaultArg == false);
1736     assert(ParmVarDeclBits.DefaultArgKind == DAK_None);
1737     assert(ParmVarDeclBits.IsKNRPromoted == false);
1738     assert(ParmVarDeclBits.IsObjCMethodParam == false);
1739     setDefaultArg(DefArg);
1740   }
1741 
1742 public:
1743   static ParmVarDecl *Create(ASTContext &C, DeclContext *DC,
1744                              SourceLocation StartLoc, SourceLocation IdLoc,
1745                              const IdentifierInfo *Id, QualType T,
1746                              TypeSourceInfo *TInfo, StorageClass S,
1747                              Expr *DefArg);
1748 
1749   static ParmVarDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
1750 
1751   SourceRange getSourceRange() const override LLVM_READONLY;
1752 
1753   void setObjCMethodScopeInfo(unsigned parameterIndex) {
1754     ParmVarDeclBits.IsObjCMethodParam = true;
1755     setParameterIndex(parameterIndex);
1756   }
1757 
1758   void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex) {
1759     assert(!ParmVarDeclBits.IsObjCMethodParam);
1760 
1761     ParmVarDeclBits.ScopeDepthOrObjCQuals = scopeDepth;
1762     assert(ParmVarDeclBits.ScopeDepthOrObjCQuals == scopeDepth
1763            && "truncation!");
1764 
1765     setParameterIndex(parameterIndex);
1766   }
1767 
1768   bool isObjCMethodParameter() const {
1769     return ParmVarDeclBits.IsObjCMethodParam;
1770   }
1771 
1772   /// Determines whether this parameter is destroyed in the callee function.
1773   bool isDestroyedInCallee() const;
1774 
1775   unsigned getFunctionScopeDepth() const {
1776     if (ParmVarDeclBits.IsObjCMethodParam) return 0;
1777     return ParmVarDeclBits.ScopeDepthOrObjCQuals;
1778   }
1779 
1780   static constexpr unsigned getMaxFunctionScopeDepth() {
1781     return (1u << NumScopeDepthOrObjCQualsBits) - 1;
1782   }
1783 
1784   /// Returns the index of this parameter in its prototype or method scope.
1785   unsigned getFunctionScopeIndex() const {
1786     return getParameterIndex();
1787   }
1788 
1789   ObjCDeclQualifier getObjCDeclQualifier() const {
1790     if (!ParmVarDeclBits.IsObjCMethodParam) return OBJC_TQ_None;
1791     return ObjCDeclQualifier(ParmVarDeclBits.ScopeDepthOrObjCQuals);
1792   }
1793   void setObjCDeclQualifier(ObjCDeclQualifier QTVal) {
1794     assert(ParmVarDeclBits.IsObjCMethodParam);
1795     ParmVarDeclBits.ScopeDepthOrObjCQuals = QTVal;
1796   }
1797 
1798   /// True if the value passed to this parameter must undergo
1799   /// K&R-style default argument promotion:
1800   ///
1801   /// C99 6.5.2.2.
1802   ///   If the expression that denotes the called function has a type
1803   ///   that does not include a prototype, the integer promotions are
1804   ///   performed on each argument, and arguments that have type float
1805   ///   are promoted to double.
1806   bool isKNRPromoted() const {
1807     return ParmVarDeclBits.IsKNRPromoted;
1808   }
1809   void setKNRPromoted(bool promoted) {
1810     ParmVarDeclBits.IsKNRPromoted = promoted;
1811   }
1812 
1813   bool isExplicitObjectParameter() const {
1814     return ExplicitObjectParameterIntroducerLoc.isValid();
1815   }
1816 
1817   void setExplicitObjectParameterLoc(SourceLocation Loc) {
1818     ExplicitObjectParameterIntroducerLoc = Loc;
1819   }
1820 
1821   SourceLocation getExplicitObjectParamThisLoc() const {
1822     return ExplicitObjectParameterIntroducerLoc;
1823   }
1824 
1825   Expr *getDefaultArg();
1826   const Expr *getDefaultArg() const {
1827     return const_cast<ParmVarDecl *>(this)->getDefaultArg();
1828   }
1829 
1830   void setDefaultArg(Expr *defarg);
1831 
1832   /// Retrieve the source range that covers the entire default
1833   /// argument.
1834   SourceRange getDefaultArgRange() const;
1835   void setUninstantiatedDefaultArg(Expr *arg);
1836   Expr *getUninstantiatedDefaultArg();
1837   const Expr *getUninstantiatedDefaultArg() const {
1838     return const_cast<ParmVarDecl *>(this)->getUninstantiatedDefaultArg();
1839   }
1840 
1841   /// Determines whether this parameter has a default argument,
1842   /// either parsed or not.
1843   bool hasDefaultArg() const;
1844 
1845   /// Determines whether this parameter has a default argument that has not
1846   /// yet been parsed. This will occur during the processing of a C++ class
1847   /// whose member functions have default arguments, e.g.,
1848   /// @code
1849   ///   class X {
1850   ///   public:
1851   ///     void f(int x = 17); // x has an unparsed default argument now
1852   ///   }; // x has a regular default argument now
1853   /// @endcode
1854   bool hasUnparsedDefaultArg() const {
1855     return ParmVarDeclBits.DefaultArgKind == DAK_Unparsed;
1856   }
1857 
1858   bool hasUninstantiatedDefaultArg() const {
1859     return ParmVarDeclBits.DefaultArgKind == DAK_Uninstantiated;
1860   }
1861 
1862   /// Specify that this parameter has an unparsed default argument.
1863   /// The argument will be replaced with a real default argument via
1864   /// setDefaultArg when the class definition enclosing the function
1865   /// declaration that owns this default argument is completed.
1866   void setUnparsedDefaultArg() {
1867     ParmVarDeclBits.DefaultArgKind = DAK_Unparsed;
1868   }
1869 
1870   bool hasInheritedDefaultArg() const {
1871     return ParmVarDeclBits.HasInheritedDefaultArg;
1872   }
1873 
1874   void setHasInheritedDefaultArg(bool I = true) {
1875     ParmVarDeclBits.HasInheritedDefaultArg = I;
1876   }
1877 
1878   QualType getOriginalType() const;
1879 
1880   /// Sets the function declaration that owns this
1881   /// ParmVarDecl. Since ParmVarDecls are often created before the
1882   /// FunctionDecls that own them, this routine is required to update
1883   /// the DeclContext appropriately.
1884   void setOwningFunction(DeclContext *FD) { setDeclContext(FD); }
1885 
1886   // Implement isa/cast/dyncast/etc.
1887   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1888   static bool classofKind(Kind K) { return K == ParmVar; }
1889 
1890 private:
1891   friend class ASTDeclReader;
1892 
1893   enum { ParameterIndexSentinel = (1 << NumParameterIndexBits) - 1 };
1894   SourceLocation ExplicitObjectParameterIntroducerLoc;
1895 
1896   void setParameterIndex(unsigned parameterIndex) {
1897     if (parameterIndex >= ParameterIndexSentinel) {
1898       setParameterIndexLarge(parameterIndex);
1899       return;
1900     }
1901 
1902     ParmVarDeclBits.ParameterIndex = parameterIndex;
1903     assert(ParmVarDeclBits.ParameterIndex == parameterIndex && "truncation!");
1904   }
1905   unsigned getParameterIndex() const {
1906     unsigned d = ParmVarDeclBits.ParameterIndex;
1907     return d == ParameterIndexSentinel ? getParameterIndexLarge() : d;
1908   }
1909 
1910   void setParameterIndexLarge(unsigned parameterIndex);
1911   unsigned getParameterIndexLarge() const;
1912 };
1913 
1914 enum class MultiVersionKind {
1915   None,
1916   Target,
1917   CPUSpecific,
1918   CPUDispatch,
1919   TargetClones,
1920   TargetVersion
1921 };
1922 
1923 /// Represents a function declaration or definition.
1924 ///
1925 /// Since a given function can be declared several times in a program,
1926 /// there may be several FunctionDecls that correspond to that
1927 /// function. Only one of those FunctionDecls will be found when
1928 /// traversing the list of declarations in the context of the
1929 /// FunctionDecl (e.g., the translation unit); this FunctionDecl
1930 /// contains all of the information known about the function. Other,
1931 /// previous declarations of the function are available via the
1932 /// getPreviousDecl() chain.
1933 class FunctionDecl : public DeclaratorDecl,
1934                      public DeclContext,
1935                      public Redeclarable<FunctionDecl> {
1936   // This class stores some data in DeclContext::FunctionDeclBits
1937   // to save some space. Use the provided accessors to access it.
1938 public:
1939   /// The kind of templated function a FunctionDecl can be.
1940   enum TemplatedKind {
1941     // Not templated.
1942     TK_NonTemplate,
1943     // The pattern in a function template declaration.
1944     TK_FunctionTemplate,
1945     // A non-template function that is an instantiation or explicit
1946     // specialization of a member of a templated class.
1947     TK_MemberSpecialization,
1948     // An instantiation or explicit specialization of a function template.
1949     // Note: this might have been instantiated from a templated class if it
1950     // is a class-scope explicit specialization.
1951     TK_FunctionTemplateSpecialization,
1952     // A function template specialization that hasn't yet been resolved to a
1953     // particular specialized function template.
1954     TK_DependentFunctionTemplateSpecialization,
1955     // A non-template function which is in a dependent scope.
1956     TK_DependentNonTemplate
1957 
1958   };
1959 
1960   /// Stashed information about a defaulted/deleted function body.
1961   class DefaultedOrDeletedFunctionInfo final
1962       : llvm::TrailingObjects<DefaultedOrDeletedFunctionInfo, DeclAccessPair,
1963                               StringLiteral *> {
1964     friend TrailingObjects;
1965     unsigned NumLookups;
1966     bool HasDeletedMessage;
1967 
1968     size_t numTrailingObjects(OverloadToken<DeclAccessPair>) const {
1969       return NumLookups;
1970     }
1971 
1972   public:
1973     static DefaultedOrDeletedFunctionInfo *
1974     Create(ASTContext &Context, ArrayRef<DeclAccessPair> Lookups,
1975            StringLiteral *DeletedMessage = nullptr);
1976 
1977     /// Get the unqualified lookup results that should be used in this
1978     /// defaulted function definition.
1979     ArrayRef<DeclAccessPair> getUnqualifiedLookups() const {
1980       return {getTrailingObjects<DeclAccessPair>(), NumLookups};
1981     }
1982 
1983     StringLiteral *getDeletedMessage() const {
1984       return HasDeletedMessage ? *getTrailingObjects<StringLiteral *>()
1985                                : nullptr;
1986     }
1987 
1988     void setDeletedMessage(StringLiteral *Message);
1989   };
1990 
1991 private:
1992   /// A new[]'d array of pointers to VarDecls for the formal
1993   /// parameters of this function.  This is null if a prototype or if there are
1994   /// no formals.
1995   ParmVarDecl **ParamInfo = nullptr;
1996 
1997   /// The active member of this union is determined by
1998   /// FunctionDeclBits.HasDefaultedOrDeletedInfo.
1999   union {
2000     /// The body of the function.
2001     LazyDeclStmtPtr Body;
2002     /// Information about a future defaulted function definition.
2003     DefaultedOrDeletedFunctionInfo *DefaultedOrDeletedInfo;
2004   };
2005 
2006   unsigned ODRHash;
2007 
2008   /// End part of this FunctionDecl's source range.
2009   ///
2010   /// We could compute the full range in getSourceRange(). However, when we're
2011   /// dealing with a function definition deserialized from a PCH/AST file,
2012   /// we can only compute the full range once the function body has been
2013   /// de-serialized, so it's far better to have the (sometimes-redundant)
2014   /// EndRangeLoc.
2015   SourceLocation EndRangeLoc;
2016 
2017   SourceLocation DefaultKWLoc;
2018 
2019   /// The template or declaration that this declaration
2020   /// describes or was instantiated from, respectively.
2021   ///
2022   /// For non-templates this value will be NULL, unless this declaration was
2023   /// declared directly inside of a function template, in which case it will
2024   /// have a pointer to a FunctionDecl, stored in the NamedDecl. For function
2025   /// declarations that describe a function template, this will be a pointer to
2026   /// a FunctionTemplateDecl, stored in the NamedDecl. For member functions of
2027   /// class template specializations, this will be a MemberSpecializationInfo
2028   /// pointer containing information about the specialization.
2029   /// For function template specializations, this will be a
2030   /// FunctionTemplateSpecializationInfo, which contains information about
2031   /// the template being specialized and the template arguments involved in
2032   /// that specialization.
2033   llvm::PointerUnion<NamedDecl *, MemberSpecializationInfo *,
2034                      FunctionTemplateSpecializationInfo *,
2035                      DependentFunctionTemplateSpecializationInfo *>
2036       TemplateOrSpecialization;
2037 
2038   /// Provides source/type location info for the declaration name embedded in
2039   /// the DeclaratorDecl base class.
2040   DeclarationNameLoc DNLoc;
2041 
2042   /// Specify that this function declaration is actually a function
2043   /// template specialization.
2044   ///
2045   /// \param C the ASTContext.
2046   ///
2047   /// \param Template the function template that this function template
2048   /// specialization specializes.
2049   ///
2050   /// \param TemplateArgs the template arguments that produced this
2051   /// function template specialization from the template.
2052   ///
2053   /// \param InsertPos If non-NULL, the position in the function template
2054   /// specialization set where the function template specialization data will
2055   /// be inserted.
2056   ///
2057   /// \param TSK the kind of template specialization this is.
2058   ///
2059   /// \param TemplateArgsAsWritten location info of template arguments.
2060   ///
2061   /// \param PointOfInstantiation point at which the function template
2062   /// specialization was first instantiated.
2063   void setFunctionTemplateSpecialization(
2064       ASTContext &C, FunctionTemplateDecl *Template,
2065       TemplateArgumentList *TemplateArgs, void *InsertPos,
2066       TemplateSpecializationKind TSK,
2067       const TemplateArgumentListInfo *TemplateArgsAsWritten,
2068       SourceLocation PointOfInstantiation);
2069 
2070   /// Specify that this record is an instantiation of the
2071   /// member function FD.
2072   void setInstantiationOfMemberFunction(ASTContext &C, FunctionDecl *FD,
2073                                         TemplateSpecializationKind TSK);
2074 
2075   void setParams(ASTContext &C, ArrayRef<ParmVarDecl *> NewParamInfo);
2076 
2077   // This is unfortunately needed because ASTDeclWriter::VisitFunctionDecl
2078   // need to access this bit but we want to avoid making ASTDeclWriter
2079   // a friend of FunctionDeclBitfields just for this.
2080   bool isDeletedBit() const { return FunctionDeclBits.IsDeleted; }
2081 
2082   /// Whether an ODRHash has been stored.
2083   bool hasODRHash() const { return FunctionDeclBits.HasODRHash; }
2084 
2085   /// State that an ODRHash has been stored.
2086   void setHasODRHash(bool B = true) { FunctionDeclBits.HasODRHash = B; }
2087 
2088 protected:
2089   FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
2090                const DeclarationNameInfo &NameInfo, QualType T,
2091                TypeSourceInfo *TInfo, StorageClass S, bool UsesFPIntrin,
2092                bool isInlineSpecified, ConstexprSpecKind ConstexprKind,
2093                Expr *TrailingRequiresClause = nullptr);
2094 
2095   using redeclarable_base = Redeclarable<FunctionDecl>;
2096 
2097   FunctionDecl *getNextRedeclarationImpl() override {
2098     return getNextRedeclaration();
2099   }
2100 
2101   FunctionDecl *getPreviousDeclImpl() override {
2102     return getPreviousDecl();
2103   }
2104 
2105   FunctionDecl *getMostRecentDeclImpl() override {
2106     return getMostRecentDecl();
2107   }
2108 
2109 public:
2110   friend class ASTDeclReader;
2111   friend class ASTDeclWriter;
2112 
2113   using redecl_range = redeclarable_base::redecl_range;
2114   using redecl_iterator = redeclarable_base::redecl_iterator;
2115 
2116   using redeclarable_base::redecls_begin;
2117   using redeclarable_base::redecls_end;
2118   using redeclarable_base::redecls;
2119   using redeclarable_base::getPreviousDecl;
2120   using redeclarable_base::getMostRecentDecl;
2121   using redeclarable_base::isFirstDecl;
2122 
2123   static FunctionDecl *
2124   Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
2125          SourceLocation NLoc, DeclarationName N, QualType T,
2126          TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin = false,
2127          bool isInlineSpecified = false, bool hasWrittenPrototype = true,
2128          ConstexprSpecKind ConstexprKind = ConstexprSpecKind::Unspecified,
2129          Expr *TrailingRequiresClause = nullptr) {
2130     DeclarationNameInfo NameInfo(N, NLoc);
2131     return FunctionDecl::Create(C, DC, StartLoc, NameInfo, T, TInfo, SC,
2132                                 UsesFPIntrin, isInlineSpecified,
2133                                 hasWrittenPrototype, ConstexprKind,
2134                                 TrailingRequiresClause);
2135   }
2136 
2137   static FunctionDecl *
2138   Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
2139          const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2140          StorageClass SC, bool UsesFPIntrin, bool isInlineSpecified,
2141          bool hasWrittenPrototype, ConstexprSpecKind ConstexprKind,
2142          Expr *TrailingRequiresClause);
2143 
2144   static FunctionDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
2145 
2146   DeclarationNameInfo getNameInfo() const {
2147     return DeclarationNameInfo(getDeclName(), getLocation(), DNLoc);
2148   }
2149 
2150   void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy,
2151                             bool Qualified) const override;
2152 
2153   void setRangeEnd(SourceLocation E) { EndRangeLoc = E; }
2154 
2155   void setDeclarationNameLoc(DeclarationNameLoc L) { DNLoc = L; }
2156 
2157   /// Returns the location of the ellipsis of a variadic function.
2158   SourceLocation getEllipsisLoc() const {
2159     const auto *FPT = getType()->getAs<FunctionProtoType>();
2160     if (FPT && FPT->isVariadic())
2161       return FPT->getEllipsisLoc();
2162     return SourceLocation();
2163   }
2164 
2165   SourceRange getSourceRange() const override LLVM_READONLY;
2166 
2167   // Function definitions.
2168   //
2169   // A function declaration may be:
2170   // - a non defining declaration,
2171   // - a definition. A function may be defined because:
2172   //   - it has a body, or will have it in the case of late parsing.
2173   //   - it has an uninstantiated body. The body does not exist because the
2174   //     function is not used yet, but the declaration is considered a
2175   //     definition and does not allow other definition of this function.
2176   //   - it does not have a user specified body, but it does not allow
2177   //     redefinition, because it is deleted/defaulted or is defined through
2178   //     some other mechanism (alias, ifunc).
2179 
2180   /// Returns true if the function has a body.
2181   ///
2182   /// The function body might be in any of the (re-)declarations of this
2183   /// function. The variant that accepts a FunctionDecl pointer will set that
2184   /// function declaration to the actual declaration containing the body (if
2185   /// there is one).
2186   bool hasBody(const FunctionDecl *&Definition) const;
2187 
2188   bool hasBody() const override {
2189     const FunctionDecl* Definition;
2190     return hasBody(Definition);
2191   }
2192 
2193   /// Returns whether the function has a trivial body that does not require any
2194   /// specific codegen.
2195   bool hasTrivialBody() const;
2196 
2197   /// Returns true if the function has a definition that does not need to be
2198   /// instantiated.
2199   ///
2200   /// The variant that accepts a FunctionDecl pointer will set that function
2201   /// declaration to the declaration that is a definition (if there is one).
2202   ///
2203   /// \param CheckForPendingFriendDefinition If \c true, also check for friend
2204   ///        declarations that were instantiated from function definitions.
2205   ///        Such a declaration behaves as if it is a definition for the
2206   ///        purpose of redefinition checking, but isn't actually a "real"
2207   ///        definition until its body is instantiated.
2208   bool isDefined(const FunctionDecl *&Definition,
2209                  bool CheckForPendingFriendDefinition = false) const;
2210 
2211   bool isDefined() const {
2212     const FunctionDecl* Definition;
2213     return isDefined(Definition);
2214   }
2215 
2216   /// Get the definition for this declaration.
2217   FunctionDecl *getDefinition() {
2218     const FunctionDecl *Definition;
2219     if (isDefined(Definition))
2220       return const_cast<FunctionDecl *>(Definition);
2221     return nullptr;
2222   }
2223   const FunctionDecl *getDefinition() const {
2224     return const_cast<FunctionDecl *>(this)->getDefinition();
2225   }
2226 
2227   /// Retrieve the body (definition) of the function. The function body might be
2228   /// in any of the (re-)declarations of this function. The variant that accepts
2229   /// a FunctionDecl pointer will set that function declaration to the actual
2230   /// declaration containing the body (if there is one).
2231   /// NOTE: For checking if there is a body, use hasBody() instead, to avoid
2232   /// unnecessary AST de-serialization of the body.
2233   Stmt *getBody(const FunctionDecl *&Definition) const;
2234 
2235   Stmt *getBody() const override {
2236     const FunctionDecl* Definition;
2237     return getBody(Definition);
2238   }
2239 
2240   /// Returns whether this specific declaration of the function is also a
2241   /// definition that does not contain uninstantiated body.
2242   ///
2243   /// This does not determine whether the function has been defined (e.g., in a
2244   /// previous definition); for that information, use isDefined.
2245   ///
2246   /// Note: the function declaration does not become a definition until the
2247   /// parser reaches the definition, if called before, this function will return
2248   /// `false`.
2249   bool isThisDeclarationADefinition() const {
2250     return isDeletedAsWritten() || isDefaulted() ||
2251            doesThisDeclarationHaveABody() || hasSkippedBody() ||
2252            willHaveBody() || hasDefiningAttr();
2253   }
2254 
2255   /// Determine whether this specific declaration of the function is a friend
2256   /// declaration that was instantiated from a function definition. Such
2257   /// declarations behave like definitions in some contexts.
2258   bool isThisDeclarationInstantiatedFromAFriendDefinition() const;
2259 
2260   /// Returns whether this specific declaration of the function has a body.
2261   bool doesThisDeclarationHaveABody() const {
2262     return (!FunctionDeclBits.HasDefaultedOrDeletedInfo && Body) ||
2263            isLateTemplateParsed();
2264   }
2265 
2266   void setBody(Stmt *B);
2267   void setLazyBody(uint64_t Offset) {
2268     FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
2269     Body = LazyDeclStmtPtr(Offset);
2270   }
2271 
2272   void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info);
2273   DefaultedOrDeletedFunctionInfo *getDefalutedOrDeletedInfo() const;
2274 
2275   /// Whether this function is variadic.
2276   bool isVariadic() const;
2277 
2278   /// Whether this function is marked as virtual explicitly.
2279   bool isVirtualAsWritten() const {
2280     return FunctionDeclBits.IsVirtualAsWritten;
2281   }
2282 
2283   /// State that this function is marked as virtual explicitly.
2284   void setVirtualAsWritten(bool V) { FunctionDeclBits.IsVirtualAsWritten = V; }
2285 
2286   /// Whether this virtual function is pure, i.e. makes the containing class
2287   /// abstract.
2288   bool isPureVirtual() const { return FunctionDeclBits.IsPureVirtual; }
2289   void setIsPureVirtual(bool P = true);
2290 
2291   /// Whether this templated function will be late parsed.
2292   bool isLateTemplateParsed() const {
2293     return FunctionDeclBits.IsLateTemplateParsed;
2294   }
2295 
2296   /// State that this templated function will be late parsed.
2297   void setLateTemplateParsed(bool ILT = true) {
2298     FunctionDeclBits.IsLateTemplateParsed = ILT;
2299   }
2300 
2301   bool isInstantiatedFromMemberTemplate() const {
2302     return FunctionDeclBits.IsInstantiatedFromMemberTemplate;
2303   }
2304   void setInstantiatedFromMemberTemplate(bool Val = true) {
2305     FunctionDeclBits.IsInstantiatedFromMemberTemplate = Val;
2306   }
2307 
2308   /// Whether this function is "trivial" in some specialized C++ senses.
2309   /// Can only be true for default constructors, copy constructors,
2310   /// copy assignment operators, and destructors.  Not meaningful until
2311   /// the class has been fully built by Sema.
2312   bool isTrivial() const { return FunctionDeclBits.IsTrivial; }
2313   void setTrivial(bool IT) { FunctionDeclBits.IsTrivial = IT; }
2314 
2315   bool isTrivialForCall() const { return FunctionDeclBits.IsTrivialForCall; }
2316   void setTrivialForCall(bool IT) { FunctionDeclBits.IsTrivialForCall = IT; }
2317 
2318   /// Whether this function is defaulted. Valid for e.g.
2319   /// special member functions, defaulted comparisions (not methods!).
2320   bool isDefaulted() const { return FunctionDeclBits.IsDefaulted; }
2321   void setDefaulted(bool D = true) { FunctionDeclBits.IsDefaulted = D; }
2322 
2323   /// Whether this function is explicitly defaulted.
2324   bool isExplicitlyDefaulted() const {
2325     return FunctionDeclBits.IsExplicitlyDefaulted;
2326   }
2327 
2328   /// State that this function is explicitly defaulted.
2329   void setExplicitlyDefaulted(bool ED = true) {
2330     FunctionDeclBits.IsExplicitlyDefaulted = ED;
2331   }
2332 
2333   SourceLocation getDefaultLoc() const {
2334     return isExplicitlyDefaulted() ? DefaultKWLoc : SourceLocation();
2335   }
2336 
2337   void setDefaultLoc(SourceLocation NewLoc) {
2338     assert((NewLoc.isInvalid() || isExplicitlyDefaulted()) &&
2339            "Can't set default loc is function isn't explicitly defaulted");
2340     DefaultKWLoc = NewLoc;
2341   }
2342 
2343   /// True if this method is user-declared and was not
2344   /// deleted or defaulted on its first declaration.
2345   bool isUserProvided() const {
2346     auto *DeclAsWritten = this;
2347     if (FunctionDecl *Pattern = getTemplateInstantiationPattern())
2348       DeclAsWritten = Pattern;
2349     return !(DeclAsWritten->isDeleted() ||
2350              DeclAsWritten->getCanonicalDecl()->isDefaulted());
2351   }
2352 
2353   bool isIneligibleOrNotSelected() const {
2354     return FunctionDeclBits.IsIneligibleOrNotSelected;
2355   }
2356   void setIneligibleOrNotSelected(bool II) {
2357     FunctionDeclBits.IsIneligibleOrNotSelected = II;
2358   }
2359 
2360   /// Whether falling off this function implicitly returns null/zero.
2361   /// If a more specific implicit return value is required, front-ends
2362   /// should synthesize the appropriate return statements.
2363   bool hasImplicitReturnZero() const {
2364     return FunctionDeclBits.HasImplicitReturnZero;
2365   }
2366 
2367   /// State that falling off this function implicitly returns null/zero.
2368   /// If a more specific implicit return value is required, front-ends
2369   /// should synthesize the appropriate return statements.
2370   void setHasImplicitReturnZero(bool IRZ) {
2371     FunctionDeclBits.HasImplicitReturnZero = IRZ;
2372   }
2373 
2374   /// Whether this function has a prototype, either because one
2375   /// was explicitly written or because it was "inherited" by merging
2376   /// a declaration without a prototype with a declaration that has a
2377   /// prototype.
2378   bool hasPrototype() const {
2379     return hasWrittenPrototype() || hasInheritedPrototype();
2380   }
2381 
2382   /// Whether this function has a written prototype.
2383   bool hasWrittenPrototype() const {
2384     return FunctionDeclBits.HasWrittenPrototype;
2385   }
2386 
2387   /// State that this function has a written prototype.
2388   void setHasWrittenPrototype(bool P = true) {
2389     FunctionDeclBits.HasWrittenPrototype = P;
2390   }
2391 
2392   /// Whether this function inherited its prototype from a
2393   /// previous declaration.
2394   bool hasInheritedPrototype() const {
2395     return FunctionDeclBits.HasInheritedPrototype;
2396   }
2397 
2398   /// State that this function inherited its prototype from a
2399   /// previous declaration.
2400   void setHasInheritedPrototype(bool P = true) {
2401     FunctionDeclBits.HasInheritedPrototype = P;
2402   }
2403 
2404   /// Whether this is a (C++11) constexpr function or constexpr constructor.
2405   bool isConstexpr() const {
2406     return getConstexprKind() != ConstexprSpecKind::Unspecified;
2407   }
2408   void setConstexprKind(ConstexprSpecKind CSK) {
2409     FunctionDeclBits.ConstexprKind = static_cast<uint64_t>(CSK);
2410   }
2411   ConstexprSpecKind getConstexprKind() const {
2412     return static_cast<ConstexprSpecKind>(FunctionDeclBits.ConstexprKind);
2413   }
2414   bool isConstexprSpecified() const {
2415     return getConstexprKind() == ConstexprSpecKind::Constexpr;
2416   }
2417   bool isConsteval() const {
2418     return getConstexprKind() == ConstexprSpecKind::Consteval;
2419   }
2420 
2421   void setBodyContainsImmediateEscalatingExpressions(bool Set) {
2422     FunctionDeclBits.BodyContainsImmediateEscalatingExpression = Set;
2423   }
2424 
2425   bool BodyContainsImmediateEscalatingExpressions() const {
2426     return FunctionDeclBits.BodyContainsImmediateEscalatingExpression;
2427   }
2428 
2429   bool isImmediateEscalating() const;
2430 
2431   // The function is a C++ immediate function.
2432   // This can be either a consteval function, or an immediate escalating
2433   // function containing an immediate escalating expression.
2434   bool isImmediateFunction() const;
2435 
2436   /// Whether the instantiation of this function is pending.
2437   /// This bit is set when the decision to instantiate this function is made
2438   /// and unset if and when the function body is created. That leaves out
2439   /// cases where instantiation did not happen because the template definition
2440   /// was not seen in this TU. This bit remains set in those cases, under the
2441   /// assumption that the instantiation will happen in some other TU.
2442   bool instantiationIsPending() const {
2443     return FunctionDeclBits.InstantiationIsPending;
2444   }
2445 
2446   /// State that the instantiation of this function is pending.
2447   /// (see instantiationIsPending)
2448   void setInstantiationIsPending(bool IC) {
2449     FunctionDeclBits.InstantiationIsPending = IC;
2450   }
2451 
2452   /// Indicates the function uses __try.
2453   bool usesSEHTry() const { return FunctionDeclBits.UsesSEHTry; }
2454   void setUsesSEHTry(bool UST) { FunctionDeclBits.UsesSEHTry = UST; }
2455 
2456   /// Whether this function has been deleted.
2457   ///
2458   /// A function that is "deleted" (via the C++0x "= delete" syntax)
2459   /// acts like a normal function, except that it cannot actually be
2460   /// called or have its address taken. Deleted functions are
2461   /// typically used in C++ overload resolution to attract arguments
2462   /// whose type or lvalue/rvalue-ness would permit the use of a
2463   /// different overload that would behave incorrectly. For example,
2464   /// one might use deleted functions to ban implicit conversion from
2465   /// a floating-point number to an Integer type:
2466   ///
2467   /// @code
2468   /// struct Integer {
2469   ///   Integer(long); // construct from a long
2470   ///   Integer(double) = delete; // no construction from float or double
2471   ///   Integer(long double) = delete; // no construction from long double
2472   /// };
2473   /// @endcode
2474   // If a function is deleted, its first declaration must be.
2475   bool isDeleted() const {
2476     return getCanonicalDecl()->FunctionDeclBits.IsDeleted;
2477   }
2478 
2479   bool isDeletedAsWritten() const {
2480     return FunctionDeclBits.IsDeleted && !isDefaulted();
2481   }
2482 
2483   void setDeletedAsWritten(bool D = true, StringLiteral *Message = nullptr);
2484 
2485   /// Determines whether this function is "main", which is the
2486   /// entry point into an executable program.
2487   bool isMain() const;
2488 
2489   /// Determines whether this function is a MSVCRT user defined entry
2490   /// point.
2491   bool isMSVCRTEntryPoint() const;
2492 
2493   /// Determines whether this operator new or delete is one
2494   /// of the reserved global placement operators:
2495   ///    void *operator new(size_t, void *);
2496   ///    void *operator new[](size_t, void *);
2497   ///    void operator delete(void *, void *);
2498   ///    void operator delete[](void *, void *);
2499   /// These functions have special behavior under [new.delete.placement]:
2500   ///    These functions are reserved, a C++ program may not define
2501   ///    functions that displace the versions in the Standard C++ library.
2502   ///    The provisions of [basic.stc.dynamic] do not apply to these
2503   ///    reserved placement forms of operator new and operator delete.
2504   ///
2505   /// This function must be an allocation or deallocation function.
2506   bool isReservedGlobalPlacementOperator() const;
2507 
2508   /// Determines whether this function is one of the replaceable
2509   /// global allocation functions:
2510   ///    void *operator new(size_t);
2511   ///    void *operator new(size_t, const std::nothrow_t &) noexcept;
2512   ///    void *operator new[](size_t);
2513   ///    void *operator new[](size_t, const std::nothrow_t &) noexcept;
2514   ///    void operator delete(void *) noexcept;
2515   ///    void operator delete(void *, std::size_t) noexcept;      [C++1y]
2516   ///    void operator delete(void *, const std::nothrow_t &) noexcept;
2517   ///    void operator delete[](void *) noexcept;
2518   ///    void operator delete[](void *, std::size_t) noexcept;    [C++1y]
2519   ///    void operator delete[](void *, const std::nothrow_t &) noexcept;
2520   /// These functions have special behavior under C++1y [expr.new]:
2521   ///    An implementation is allowed to omit a call to a replaceable global
2522   ///    allocation function. [...]
2523   ///
2524   /// If this function is an aligned allocation/deallocation function, return
2525   /// the parameter number of the requested alignment through AlignmentParam.
2526   ///
2527   /// If this function is an allocation/deallocation function that takes
2528   /// the `std::nothrow_t` tag, return true through IsNothrow,
2529   bool isReplaceableGlobalAllocationFunction(
2530       std::optional<unsigned> *AlignmentParam = nullptr,
2531       bool *IsNothrow = nullptr) const;
2532 
2533   /// Determine if this function provides an inline implementation of a builtin.
2534   bool isInlineBuiltinDeclaration() const;
2535 
2536   /// Determine whether this is a destroying operator delete.
2537   bool isDestroyingOperatorDelete() const;
2538 
2539   /// Compute the language linkage.
2540   LanguageLinkage getLanguageLinkage() const;
2541 
2542   /// Determines whether this function is a function with
2543   /// external, C linkage.
2544   bool isExternC() const;
2545 
2546   /// Determines whether this function's context is, or is nested within,
2547   /// a C++ extern "C" linkage spec.
2548   bool isInExternCContext() const;
2549 
2550   /// Determines whether this function's context is, or is nested within,
2551   /// a C++ extern "C++" linkage spec.
2552   bool isInExternCXXContext() const;
2553 
2554   /// Determines whether this is a global function.
2555   bool isGlobal() const;
2556 
2557   /// Determines whether this function is known to be 'noreturn', through
2558   /// an attribute on its declaration or its type.
2559   bool isNoReturn() const;
2560 
2561   /// True if the function was a definition but its body was skipped.
2562   bool hasSkippedBody() const { return FunctionDeclBits.HasSkippedBody; }
2563   void setHasSkippedBody(bool Skipped = true) {
2564     FunctionDeclBits.HasSkippedBody = Skipped;
2565   }
2566 
2567   /// True if this function will eventually have a body, once it's fully parsed.
2568   bool willHaveBody() const { return FunctionDeclBits.WillHaveBody; }
2569   void setWillHaveBody(bool V = true) { FunctionDeclBits.WillHaveBody = V; }
2570 
2571   /// True if this function is considered a multiversioned function.
2572   bool isMultiVersion() const {
2573     return getCanonicalDecl()->FunctionDeclBits.IsMultiVersion;
2574   }
2575 
2576   /// Sets the multiversion state for this declaration and all of its
2577   /// redeclarations.
2578   void setIsMultiVersion(bool V = true) {
2579     getCanonicalDecl()->FunctionDeclBits.IsMultiVersion = V;
2580   }
2581 
2582   // Sets that this is a constrained friend where the constraint refers to an
2583   // enclosing template.
2584   void setFriendConstraintRefersToEnclosingTemplate(bool V = true) {
2585     getCanonicalDecl()
2586         ->FunctionDeclBits.FriendConstraintRefersToEnclosingTemplate = V;
2587   }
2588   // Indicates this function is a constrained friend, where the constraint
2589   // refers to an enclosing template for hte purposes of [temp.friend]p9.
2590   bool FriendConstraintRefersToEnclosingTemplate() const {
2591     return getCanonicalDecl()
2592         ->FunctionDeclBits.FriendConstraintRefersToEnclosingTemplate;
2593   }
2594 
2595   /// Determine whether a function is a friend function that cannot be
2596   /// redeclared outside of its class, per C++ [temp.friend]p9.
2597   bool isMemberLikeConstrainedFriend() const;
2598 
2599   /// Gets the kind of multiversioning attribute this declaration has. Note that
2600   /// this can return a value even if the function is not multiversion, such as
2601   /// the case of 'target'.
2602   MultiVersionKind getMultiVersionKind() const;
2603 
2604 
2605   /// True if this function is a multiversioned dispatch function as a part of
2606   /// the cpu_specific/cpu_dispatch functionality.
2607   bool isCPUDispatchMultiVersion() const;
2608   /// True if this function is a multiversioned processor specific function as a
2609   /// part of the cpu_specific/cpu_dispatch functionality.
2610   bool isCPUSpecificMultiVersion() const;
2611 
2612   /// True if this function is a multiversioned dispatch function as a part of
2613   /// the target functionality.
2614   bool isTargetMultiVersion() const;
2615 
2616   /// True if this function is the default version of a multiversioned dispatch
2617   /// function as a part of the target functionality.
2618   bool isTargetMultiVersionDefault() const;
2619 
2620   /// True if this function is a multiversioned dispatch function as a part of
2621   /// the target-clones functionality.
2622   bool isTargetClonesMultiVersion() const;
2623 
2624   /// True if this function is a multiversioned dispatch function as a part of
2625   /// the target-version functionality.
2626   bool isTargetVersionMultiVersion() const;
2627 
2628   /// \brief Get the associated-constraints of this function declaration.
2629   /// Currently, this will either be a vector of size 1 containing the
2630   /// trailing-requires-clause or an empty vector.
2631   ///
2632   /// Use this instead of getTrailingRequiresClause for concepts APIs that
2633   /// accept an ArrayRef of constraint expressions.
2634   void getAssociatedConstraints(SmallVectorImpl<const Expr *> &AC) const {
2635     if (auto *TRC = getTrailingRequiresClause())
2636       AC.push_back(TRC);
2637   }
2638 
2639   /// Get the message that indicates why this function was deleted.
2640   StringLiteral *getDeletedMessage() const {
2641     return FunctionDeclBits.HasDefaultedOrDeletedInfo
2642                ? DefaultedOrDeletedInfo->getDeletedMessage()
2643                : nullptr;
2644   }
2645 
2646   void setPreviousDeclaration(FunctionDecl * PrevDecl);
2647 
2648   FunctionDecl *getCanonicalDecl() override;
2649   const FunctionDecl *getCanonicalDecl() const {
2650     return const_cast<FunctionDecl*>(this)->getCanonicalDecl();
2651   }
2652 
2653   unsigned getBuiltinID(bool ConsiderWrapperFunctions = false) const;
2654 
2655   // ArrayRef interface to parameters.
2656   ArrayRef<ParmVarDecl *> parameters() const {
2657     return {ParamInfo, getNumParams()};
2658   }
2659   MutableArrayRef<ParmVarDecl *> parameters() {
2660     return {ParamInfo, getNumParams()};
2661   }
2662 
2663   // Iterator access to formal parameters.
2664   using param_iterator = MutableArrayRef<ParmVarDecl *>::iterator;
2665   using param_const_iterator = ArrayRef<ParmVarDecl *>::const_iterator;
2666 
2667   bool param_empty() const { return parameters().empty(); }
2668   param_iterator param_begin() { return parameters().begin(); }
2669   param_iterator param_end() { return parameters().end(); }
2670   param_const_iterator param_begin() const { return parameters().begin(); }
2671   param_const_iterator param_end() const { return parameters().end(); }
2672   size_t param_size() const { return parameters().size(); }
2673 
2674   /// Return the number of parameters this function must have based on its
2675   /// FunctionType.  This is the length of the ParamInfo array after it has been
2676   /// created.
2677   unsigned getNumParams() const;
2678 
2679   const ParmVarDecl *getParamDecl(unsigned i) const {
2680     assert(i < getNumParams() && "Illegal param #");
2681     return ParamInfo[i];
2682   }
2683   ParmVarDecl *getParamDecl(unsigned i) {
2684     assert(i < getNumParams() && "Illegal param #");
2685     return ParamInfo[i];
2686   }
2687   void setParams(ArrayRef<ParmVarDecl *> NewParamInfo) {
2688     setParams(getASTContext(), NewParamInfo);
2689   }
2690 
2691   /// Returns the minimum number of arguments needed to call this function. This
2692   /// may be fewer than the number of function parameters, if some of the
2693   /// parameters have default arguments (in C++).
2694   unsigned getMinRequiredArguments() const;
2695 
2696   /// Returns the minimum number of non-object arguments needed to call this
2697   /// function. This produces the same value as getMinRequiredArguments except
2698   /// it does not count the explicit object argument, if any.
2699   unsigned getMinRequiredExplicitArguments() const;
2700 
2701   bool hasCXXExplicitFunctionObjectParameter() const;
2702 
2703   unsigned getNumNonObjectParams() const;
2704 
2705   const ParmVarDecl *getNonObjectParameter(unsigned I) const {
2706     return getParamDecl(hasCXXExplicitFunctionObjectParameter() ? I + 1 : I);
2707   }
2708 
2709   ParmVarDecl *getNonObjectParameter(unsigned I) {
2710     return getParamDecl(hasCXXExplicitFunctionObjectParameter() ? I + 1 : I);
2711   }
2712 
2713   /// Determine whether this function has a single parameter, or multiple
2714   /// parameters where all but the first have default arguments.
2715   ///
2716   /// This notion is used in the definition of copy/move constructors and
2717   /// initializer list constructors. Note that, unlike getMinRequiredArguments,
2718   /// parameter packs are not treated specially here.
2719   bool hasOneParamOrDefaultArgs() const;
2720 
2721   /// Find the source location information for how the type of this function
2722   /// was written. May be absent (for example if the function was declared via
2723   /// a typedef) and may contain a different type from that of the function
2724   /// (for example if the function type was adjusted by an attribute).
2725   FunctionTypeLoc getFunctionTypeLoc() const;
2726 
2727   QualType getReturnType() const {
2728     return getType()->castAs<FunctionType>()->getReturnType();
2729   }
2730 
2731   /// Attempt to compute an informative source range covering the
2732   /// function return type. This may omit qualifiers and other information with
2733   /// limited representation in the AST.
2734   SourceRange getReturnTypeSourceRange() const;
2735 
2736   /// Attempt to compute an informative source range covering the
2737   /// function parameters, including the ellipsis of a variadic function.
2738   /// The source range excludes the parentheses, and is invalid if there are
2739   /// no parameters and no ellipsis.
2740   SourceRange getParametersSourceRange() const;
2741 
2742   /// Get the declared return type, which may differ from the actual return
2743   /// type if the return type is deduced.
2744   QualType getDeclaredReturnType() const {
2745     auto *TSI = getTypeSourceInfo();
2746     QualType T = TSI ? TSI->getType() : getType();
2747     return T->castAs<FunctionType>()->getReturnType();
2748   }
2749 
2750   /// Gets the ExceptionSpecificationType as declared.
2751   ExceptionSpecificationType getExceptionSpecType() const {
2752     auto *TSI = getTypeSourceInfo();
2753     QualType T = TSI ? TSI->getType() : getType();
2754     const auto *FPT = T->getAs<FunctionProtoType>();
2755     return FPT ? FPT->getExceptionSpecType() : EST_None;
2756   }
2757 
2758   /// Attempt to compute an informative source range covering the
2759   /// function exception specification, if any.
2760   SourceRange getExceptionSpecSourceRange() const;
2761 
2762   /// Determine the type of an expression that calls this function.
2763   QualType getCallResultType() const {
2764     return getType()->castAs<FunctionType>()->getCallResultType(
2765         getASTContext());
2766   }
2767 
2768   /// Returns the storage class as written in the source. For the
2769   /// computed linkage of symbol, see getLinkage.
2770   StorageClass getStorageClass() const {
2771     return static_cast<StorageClass>(FunctionDeclBits.SClass);
2772   }
2773 
2774   /// Sets the storage class as written in the source.
2775   void setStorageClass(StorageClass SClass) {
2776     FunctionDeclBits.SClass = SClass;
2777   }
2778 
2779   /// Determine whether the "inline" keyword was specified for this
2780   /// function.
2781   bool isInlineSpecified() const { return FunctionDeclBits.IsInlineSpecified; }
2782 
2783   /// Set whether the "inline" keyword was specified for this function.
2784   void setInlineSpecified(bool I) {
2785     FunctionDeclBits.IsInlineSpecified = I;
2786     FunctionDeclBits.IsInline = I;
2787   }
2788 
2789   /// Determine whether the function was declared in source context
2790   /// that requires constrained FP intrinsics
2791   bool UsesFPIntrin() const { return FunctionDeclBits.UsesFPIntrin; }
2792 
2793   /// Set whether the function was declared in source context
2794   /// that requires constrained FP intrinsics
2795   void setUsesFPIntrin(bool I) { FunctionDeclBits.UsesFPIntrin = I; }
2796 
2797   /// Flag that this function is implicitly inline.
2798   void setImplicitlyInline(bool I = true) { FunctionDeclBits.IsInline = I; }
2799 
2800   /// Determine whether this function should be inlined, because it is
2801   /// either marked "inline" or "constexpr" or is a member function of a class
2802   /// that was defined in the class body.
2803   bool isInlined() const { return FunctionDeclBits.IsInline; }
2804 
2805   bool isInlineDefinitionExternallyVisible() const;
2806 
2807   bool isMSExternInline() const;
2808 
2809   bool doesDeclarationForceExternallyVisibleDefinition() const;
2810 
2811   bool isStatic() const { return getStorageClass() == SC_Static; }
2812 
2813   /// Whether this function declaration represents an C++ overloaded
2814   /// operator, e.g., "operator+".
2815   bool isOverloadedOperator() const {
2816     return getOverloadedOperator() != OO_None;
2817   }
2818 
2819   OverloadedOperatorKind getOverloadedOperator() const;
2820 
2821   const IdentifierInfo *getLiteralIdentifier() const;
2822 
2823   /// If this function is an instantiation of a member function
2824   /// of a class template specialization, retrieves the function from
2825   /// which it was instantiated.
2826   ///
2827   /// This routine will return non-NULL for (non-templated) member
2828   /// functions of class templates and for instantiations of function
2829   /// templates. For example, given:
2830   ///
2831   /// \code
2832   /// template<typename T>
2833   /// struct X {
2834   ///   void f(T);
2835   /// };
2836   /// \endcode
2837   ///
2838   /// The declaration for X<int>::f is a (non-templated) FunctionDecl
2839   /// whose parent is the class template specialization X<int>. For
2840   /// this declaration, getInstantiatedFromFunction() will return
2841   /// the FunctionDecl X<T>::A. When a complete definition of
2842   /// X<int>::A is required, it will be instantiated from the
2843   /// declaration returned by getInstantiatedFromMemberFunction().
2844   FunctionDecl *getInstantiatedFromMemberFunction() const;
2845 
2846   /// What kind of templated function this is.
2847   TemplatedKind getTemplatedKind() const;
2848 
2849   /// If this function is an instantiation of a member function of a
2850   /// class template specialization, retrieves the member specialization
2851   /// information.
2852   MemberSpecializationInfo *getMemberSpecializationInfo() const;
2853 
2854   /// Specify that this record is an instantiation of the
2855   /// member function FD.
2856   void setInstantiationOfMemberFunction(FunctionDecl *FD,
2857                                         TemplateSpecializationKind TSK) {
2858     setInstantiationOfMemberFunction(getASTContext(), FD, TSK);
2859   }
2860 
2861   /// Specify that this function declaration was instantiated from a
2862   /// FunctionDecl FD. This is only used if this is a function declaration
2863   /// declared locally inside of a function template.
2864   void setInstantiatedFromDecl(FunctionDecl *FD);
2865 
2866   FunctionDecl *getInstantiatedFromDecl() const;
2867 
2868   /// Retrieves the function template that is described by this
2869   /// function declaration.
2870   ///
2871   /// Every function template is represented as a FunctionTemplateDecl
2872   /// and a FunctionDecl (or something derived from FunctionDecl). The
2873   /// former contains template properties (such as the template
2874   /// parameter lists) while the latter contains the actual
2875   /// description of the template's
2876   /// contents. FunctionTemplateDecl::getTemplatedDecl() retrieves the
2877   /// FunctionDecl that describes the function template,
2878   /// getDescribedFunctionTemplate() retrieves the
2879   /// FunctionTemplateDecl from a FunctionDecl.
2880   FunctionTemplateDecl *getDescribedFunctionTemplate() const;
2881 
2882   void setDescribedFunctionTemplate(FunctionTemplateDecl *Template);
2883 
2884   /// Determine whether this function is a function template
2885   /// specialization.
2886   bool isFunctionTemplateSpecialization() const;
2887 
2888   /// If this function is actually a function template specialization,
2889   /// retrieve information about this function template specialization.
2890   /// Otherwise, returns NULL.
2891   FunctionTemplateSpecializationInfo *getTemplateSpecializationInfo() const;
2892 
2893   /// Determines whether this function is a function template
2894   /// specialization or a member of a class template specialization that can
2895   /// be implicitly instantiated.
2896   bool isImplicitlyInstantiable() const;
2897 
2898   /// Determines if the given function was instantiated from a
2899   /// function template.
2900   bool isTemplateInstantiation() const;
2901 
2902   /// Retrieve the function declaration from which this function could
2903   /// be instantiated, if it is an instantiation (rather than a non-template
2904   /// or a specialization, for example).
2905   ///
2906   /// If \p ForDefinition is \c false, explicit specializations will be treated
2907   /// as if they were implicit instantiations. This will then find the pattern
2908   /// corresponding to non-definition portions of the declaration, such as
2909   /// default arguments and the exception specification.
2910   FunctionDecl *
2911   getTemplateInstantiationPattern(bool ForDefinition = true) const;
2912 
2913   /// Retrieve the primary template that this function template
2914   /// specialization either specializes or was instantiated from.
2915   ///
2916   /// If this function declaration is not a function template specialization,
2917   /// returns NULL.
2918   FunctionTemplateDecl *getPrimaryTemplate() const;
2919 
2920   /// Retrieve the template arguments used to produce this function
2921   /// template specialization from the primary template.
2922   ///
2923   /// If this function declaration is not a function template specialization,
2924   /// returns NULL.
2925   const TemplateArgumentList *getTemplateSpecializationArgs() const;
2926 
2927   /// Retrieve the template argument list as written in the sources,
2928   /// if any.
2929   ///
2930   /// If this function declaration is not a function template specialization
2931   /// or if it had no explicit template argument list, returns NULL.
2932   /// Note that it an explicit template argument list may be written empty,
2933   /// e.g., template<> void foo<>(char* s);
2934   const ASTTemplateArgumentListInfo*
2935   getTemplateSpecializationArgsAsWritten() const;
2936 
2937   /// Specify that this function declaration is actually a function
2938   /// template specialization.
2939   ///
2940   /// \param Template the function template that this function template
2941   /// specialization specializes.
2942   ///
2943   /// \param TemplateArgs the template arguments that produced this
2944   /// function template specialization from the template.
2945   ///
2946   /// \param InsertPos If non-NULL, the position in the function template
2947   /// specialization set where the function template specialization data will
2948   /// be inserted.
2949   ///
2950   /// \param TSK the kind of template specialization this is.
2951   ///
2952   /// \param TemplateArgsAsWritten location info of template arguments.
2953   ///
2954   /// \param PointOfInstantiation point at which the function template
2955   /// specialization was first instantiated.
2956   void setFunctionTemplateSpecialization(
2957       FunctionTemplateDecl *Template, TemplateArgumentList *TemplateArgs,
2958       void *InsertPos,
2959       TemplateSpecializationKind TSK = TSK_ImplicitInstantiation,
2960       TemplateArgumentListInfo *TemplateArgsAsWritten = nullptr,
2961       SourceLocation PointOfInstantiation = SourceLocation()) {
2962     setFunctionTemplateSpecialization(getASTContext(), Template, TemplateArgs,
2963                                       InsertPos, TSK, TemplateArgsAsWritten,
2964                                       PointOfInstantiation);
2965   }
2966 
2967   /// Specifies that this function declaration is actually a
2968   /// dependent function template specialization.
2969   void setDependentTemplateSpecialization(
2970       ASTContext &Context, const UnresolvedSetImpl &Templates,
2971       const TemplateArgumentListInfo *TemplateArgs);
2972 
2973   DependentFunctionTemplateSpecializationInfo *
2974   getDependentSpecializationInfo() const;
2975 
2976   /// Determine what kind of template instantiation this function
2977   /// represents.
2978   TemplateSpecializationKind getTemplateSpecializationKind() const;
2979 
2980   /// Determine the kind of template specialization this function represents
2981   /// for the purpose of template instantiation.
2982   TemplateSpecializationKind
2983   getTemplateSpecializationKindForInstantiation() const;
2984 
2985   /// Determine what kind of template instantiation this function
2986   /// represents.
2987   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
2988                         SourceLocation PointOfInstantiation = SourceLocation());
2989 
2990   /// Retrieve the (first) point of instantiation of a function template
2991   /// specialization or a member of a class template specialization.
2992   ///
2993   /// \returns the first point of instantiation, if this function was
2994   /// instantiated from a template; otherwise, returns an invalid source
2995   /// location.
2996   SourceLocation getPointOfInstantiation() const;
2997 
2998   /// Determine whether this is or was instantiated from an out-of-line
2999   /// definition of a member function.
3000   bool isOutOfLine() const override;
3001 
3002   /// Identify a memory copying or setting function.
3003   /// If the given function is a memory copy or setting function, returns
3004   /// the corresponding Builtin ID. If the function is not a memory function,
3005   /// returns 0.
3006   unsigned getMemoryFunctionKind() const;
3007 
3008   /// Returns ODRHash of the function.  This value is calculated and
3009   /// stored on first call, then the stored value returned on the other calls.
3010   unsigned getODRHash();
3011 
3012   /// Returns cached ODRHash of the function.  This must have been previously
3013   /// computed and stored.
3014   unsigned getODRHash() const;
3015 
3016   FunctionEffectsRef getFunctionEffects() const {
3017     // Effects may differ between declarations, but they should be propagated
3018     // from old to new on any redeclaration, so it suffices to look at
3019     // getMostRecentDecl().
3020     if (const auto *FPT =
3021             getMostRecentDecl()->getType()->getAs<FunctionProtoType>())
3022       return FPT->getFunctionEffects();
3023     return {};
3024   }
3025 
3026   // Implement isa/cast/dyncast/etc.
3027   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3028   static bool classofKind(Kind K) {
3029     return K >= firstFunction && K <= lastFunction;
3030   }
3031   static DeclContext *castToDeclContext(const FunctionDecl *D) {
3032     return static_cast<DeclContext *>(const_cast<FunctionDecl*>(D));
3033   }
3034   static FunctionDecl *castFromDeclContext(const DeclContext *DC) {
3035     return static_cast<FunctionDecl *>(const_cast<DeclContext*>(DC));
3036   }
3037 };
3038 
3039 /// Represents a member of a struct/union/class.
3040 class FieldDecl : public DeclaratorDecl, public Mergeable<FieldDecl> {
3041   /// The kinds of value we can store in StorageKind.
3042   ///
3043   /// Note that this is compatible with InClassInitStyle except for
3044   /// ISK_CapturedVLAType.
3045   enum InitStorageKind {
3046     /// If the pointer is null, there's nothing special.  Otherwise,
3047     /// this is a bitfield and the pointer is the Expr* storing the
3048     /// bit-width.
3049     ISK_NoInit = (unsigned) ICIS_NoInit,
3050 
3051     /// The pointer is an (optional due to delayed parsing) Expr*
3052     /// holding the copy-initializer.
3053     ISK_InClassCopyInit = (unsigned) ICIS_CopyInit,
3054 
3055     /// The pointer is an (optional due to delayed parsing) Expr*
3056     /// holding the list-initializer.
3057     ISK_InClassListInit = (unsigned) ICIS_ListInit,
3058 
3059     /// The pointer is a VariableArrayType* that's been captured;
3060     /// the enclosing context is a lambda or captured statement.
3061     ISK_CapturedVLAType,
3062   };
3063 
3064   LLVM_PREFERRED_TYPE(bool)
3065   unsigned BitField : 1;
3066   LLVM_PREFERRED_TYPE(bool)
3067   unsigned Mutable : 1;
3068   LLVM_PREFERRED_TYPE(InitStorageKind)
3069   unsigned StorageKind : 2;
3070   mutable unsigned CachedFieldIndex : 28;
3071 
3072   /// If this is a bitfield with a default member initializer, this
3073   /// structure is used to represent the two expressions.
3074   struct InitAndBitWidthStorage {
3075     LazyDeclStmtPtr Init;
3076     Expr *BitWidth;
3077   };
3078 
3079   /// Storage for either the bit-width, the in-class initializer, or
3080   /// both (via InitAndBitWidth), or the captured variable length array bound.
3081   ///
3082   /// If the storage kind is ISK_InClassCopyInit or
3083   /// ISK_InClassListInit, but the initializer is null, then this
3084   /// field has an in-class initializer that has not yet been parsed
3085   /// and attached.
3086   // FIXME: Tail-allocate this to reduce the size of FieldDecl in the
3087   // overwhelmingly common case that we have none of these things.
3088   union {
3089     // Active member if ISK is not ISK_CapturedVLAType and BitField is false.
3090     LazyDeclStmtPtr Init;
3091     // Active member if ISK is ISK_NoInit and BitField is true.
3092     Expr *BitWidth;
3093     // Active member if ISK is ISK_InClass*Init and BitField is true.
3094     InitAndBitWidthStorage *InitAndBitWidth;
3095     // Active member if ISK is ISK_CapturedVLAType.
3096     const VariableArrayType *CapturedVLAType;
3097   };
3098 
3099 protected:
3100   FieldDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
3101             SourceLocation IdLoc, const IdentifierInfo *Id, QualType T,
3102             TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
3103             InClassInitStyle InitStyle)
3104       : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc), BitField(false),
3105         Mutable(Mutable), StorageKind((InitStorageKind)InitStyle),
3106         CachedFieldIndex(0), Init() {
3107     if (BW)
3108       setBitWidth(BW);
3109   }
3110 
3111 public:
3112   friend class ASTDeclReader;
3113   friend class ASTDeclWriter;
3114 
3115   static FieldDecl *Create(const ASTContext &C, DeclContext *DC,
3116                            SourceLocation StartLoc, SourceLocation IdLoc,
3117                            const IdentifierInfo *Id, QualType T,
3118                            TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
3119                            InClassInitStyle InitStyle);
3120 
3121   static FieldDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
3122 
3123   /// Returns the index of this field within its record,
3124   /// as appropriate for passing to ASTRecordLayout::getFieldOffset.
3125   unsigned getFieldIndex() const {
3126     const FieldDecl *Canonical = getCanonicalDecl();
3127     if (Canonical->CachedFieldIndex == 0) {
3128       Canonical->setCachedFieldIndex();
3129       assert(Canonical->CachedFieldIndex != 0);
3130     }
3131     return Canonical->CachedFieldIndex - 1;
3132   }
3133 
3134 private:
3135   /// Set CachedFieldIndex to the index of this field plus one.
3136   void setCachedFieldIndex() const;
3137 
3138 public:
3139   /// Determines whether this field is mutable (C++ only).
3140   bool isMutable() const { return Mutable; }
3141 
3142   /// Determines whether this field is a bitfield.
3143   bool isBitField() const { return BitField; }
3144 
3145   /// Determines whether this is an unnamed bitfield.
3146   bool isUnnamedBitField() const { return isBitField() && !getDeclName(); }
3147 
3148   /// Determines whether this field is a
3149   /// representative for an anonymous struct or union. Such fields are
3150   /// unnamed and are implicitly generated by the implementation to
3151   /// store the data for the anonymous union or struct.
3152   bool isAnonymousStructOrUnion() const;
3153 
3154   /// Returns the expression that represents the bit width, if this field
3155   /// is a bit field. For non-bitfields, this returns \c nullptr.
3156   Expr *getBitWidth() const {
3157     if (!BitField)
3158       return nullptr;
3159     return hasInClassInitializer() ? InitAndBitWidth->BitWidth : BitWidth;
3160   }
3161 
3162   /// Computes the bit width of this field, if this is a bit field.
3163   /// May not be called on non-bitfields.
3164   /// Note that in order to successfully use this function, the bitwidth
3165   /// expression must be a ConstantExpr with a valid integer result set.
3166   unsigned getBitWidthValue() const;
3167 
3168   /// Set the bit-field width for this member.
3169   // Note: used by some clients (i.e., do not remove it).
3170   void setBitWidth(Expr *Width) {
3171     assert(!hasCapturedVLAType() && !BitField &&
3172            "bit width or captured type already set");
3173     assert(Width && "no bit width specified");
3174     if (hasInClassInitializer())
3175       InitAndBitWidth =
3176           new (getASTContext()) InitAndBitWidthStorage{Init, Width};
3177     else
3178       BitWidth = Width;
3179     BitField = true;
3180   }
3181 
3182   /// Remove the bit-field width from this member.
3183   // Note: used by some clients (i.e., do not remove it).
3184   void removeBitWidth() {
3185     assert(isBitField() && "no bitfield width to remove");
3186     if (hasInClassInitializer()) {
3187       // Read the old initializer before we change the active union member.
3188       auto ExistingInit = InitAndBitWidth->Init;
3189       Init = ExistingInit;
3190     }
3191     BitField = false;
3192   }
3193 
3194   /// Is this a zero-length bit-field? Such bit-fields aren't really bit-fields
3195   /// at all and instead act as a separator between contiguous runs of other
3196   /// bit-fields.
3197   bool isZeroLengthBitField() const;
3198 
3199   /// Determine if this field is a subobject of zero size, that is, either a
3200   /// zero-length bit-field or a field of empty class type with the
3201   /// [[no_unique_address]] attribute.
3202   bool isZeroSize(const ASTContext &Ctx) const;
3203 
3204   /// Determine if this field is of potentially-overlapping class type, that
3205   /// is, subobject with the [[no_unique_address]] attribute
3206   bool isPotentiallyOverlapping() const;
3207 
3208   /// Get the kind of (C++11) default member initializer that this field has.
3209   InClassInitStyle getInClassInitStyle() const {
3210     return (StorageKind == ISK_CapturedVLAType ? ICIS_NoInit
3211                                                : (InClassInitStyle)StorageKind);
3212   }
3213 
3214   /// Determine whether this member has a C++11 default member initializer.
3215   bool hasInClassInitializer() const {
3216     return getInClassInitStyle() != ICIS_NoInit;
3217   }
3218 
3219   /// Determine whether getInClassInitializer() would return a non-null pointer
3220   /// without deserializing the initializer.
3221   bool hasNonNullInClassInitializer() const {
3222     return hasInClassInitializer() && (BitField ? InitAndBitWidth->Init : Init);
3223   }
3224 
3225   /// Get the C++11 default member initializer for this member, or null if one
3226   /// has not been set. If a valid declaration has a default member initializer,
3227   /// but this returns null, then we have not parsed and attached it yet.
3228   Expr *getInClassInitializer() const;
3229 
3230   /// Set the C++11 in-class initializer for this member.
3231   void setInClassInitializer(Expr *NewInit);
3232 
3233   /// Find the FieldDecl specified in a FAM's "counted_by" attribute. Returns
3234   /// \p nullptr if either the attribute or the field doesn't exist.
3235   const FieldDecl *findCountedByField() const;
3236 
3237 private:
3238   void setLazyInClassInitializer(LazyDeclStmtPtr NewInit);
3239 
3240 public:
3241   /// Remove the C++11 in-class initializer from this member.
3242   void removeInClassInitializer() {
3243     assert(hasInClassInitializer() && "no initializer to remove");
3244     StorageKind = ISK_NoInit;
3245     if (BitField) {
3246       // Read the bit width before we change the active union member.
3247       Expr *ExistingBitWidth = InitAndBitWidth->BitWidth;
3248       BitWidth = ExistingBitWidth;
3249     }
3250   }
3251 
3252   /// Determine whether this member captures the variable length array
3253   /// type.
3254   bool hasCapturedVLAType() const {
3255     return StorageKind == ISK_CapturedVLAType;
3256   }
3257 
3258   /// Get the captured variable length array type.
3259   const VariableArrayType *getCapturedVLAType() const {
3260     return hasCapturedVLAType() ? CapturedVLAType : nullptr;
3261   }
3262 
3263   /// Set the captured variable length array type for this field.
3264   void setCapturedVLAType(const VariableArrayType *VLAType);
3265 
3266   /// Returns the parent of this field declaration, which
3267   /// is the struct in which this field is defined.
3268   ///
3269   /// Returns null if this is not a normal class/struct field declaration, e.g.
3270   /// ObjCAtDefsFieldDecl, ObjCIvarDecl.
3271   const RecordDecl *getParent() const {
3272     return dyn_cast<RecordDecl>(getDeclContext());
3273   }
3274 
3275   RecordDecl *getParent() {
3276     return dyn_cast<RecordDecl>(getDeclContext());
3277   }
3278 
3279   SourceRange getSourceRange() const override LLVM_READONLY;
3280 
3281   /// Retrieves the canonical declaration of this field.
3282   FieldDecl *getCanonicalDecl() override { return getFirstDecl(); }
3283   const FieldDecl *getCanonicalDecl() const { return getFirstDecl(); }
3284 
3285   // Implement isa/cast/dyncast/etc.
3286   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3287   static bool classofKind(Kind K) { return K >= firstField && K <= lastField; }
3288 
3289   void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override;
3290 };
3291 
3292 /// An instance of this object exists for each enum constant
3293 /// that is defined.  For example, in "enum X {a,b}", each of a/b are
3294 /// EnumConstantDecl's, X is an instance of EnumDecl, and the type of a/b is a
3295 /// TagType for the X EnumDecl.
3296 class EnumConstantDecl : public ValueDecl,
3297                          public Mergeable<EnumConstantDecl>,
3298                          public APIntStorage {
3299   Stmt *Init; // an integer constant expression
3300   bool IsUnsigned;
3301 
3302 protected:
3303   EnumConstantDecl(const ASTContext &C, DeclContext *DC, SourceLocation L,
3304                    IdentifierInfo *Id, QualType T, Expr *E,
3305                    const llvm::APSInt &V);
3306 
3307 public:
3308   friend class StmtIteratorBase;
3309 
3310   static EnumConstantDecl *Create(ASTContext &C, EnumDecl *DC,
3311                                   SourceLocation L, IdentifierInfo *Id,
3312                                   QualType T, Expr *E,
3313                                   const llvm::APSInt &V);
3314   static EnumConstantDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
3315 
3316   const Expr *getInitExpr() const { return (const Expr*) Init; }
3317   Expr *getInitExpr() { return (Expr*) Init; }
3318   llvm::APSInt getInitVal() const {
3319     return llvm::APSInt(getValue(), IsUnsigned);
3320   }
3321 
3322   void setInitExpr(Expr *E) { Init = (Stmt*) E; }
3323   void setInitVal(const ASTContext &C, const llvm::APSInt &V) {
3324     setValue(C, V);
3325     IsUnsigned = V.isUnsigned();
3326   }
3327 
3328   SourceRange getSourceRange() const override LLVM_READONLY;
3329 
3330   /// Retrieves the canonical declaration of this enumerator.
3331   EnumConstantDecl *getCanonicalDecl() override { return getFirstDecl(); }
3332   const EnumConstantDecl *getCanonicalDecl() const { return getFirstDecl(); }
3333 
3334   // Implement isa/cast/dyncast/etc.
3335   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3336   static bool classofKind(Kind K) { return K == EnumConstant; }
3337 };
3338 
3339 /// Represents a field injected from an anonymous union/struct into the parent
3340 /// scope. These are always implicit.
3341 class IndirectFieldDecl : public ValueDecl,
3342                           public Mergeable<IndirectFieldDecl> {
3343   NamedDecl **Chaining;
3344   unsigned ChainingSize;
3345 
3346   IndirectFieldDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
3347                     DeclarationName N, QualType T,
3348                     MutableArrayRef<NamedDecl *> CH);
3349 
3350   void anchor() override;
3351 
3352 public:
3353   friend class ASTDeclReader;
3354 
3355   static IndirectFieldDecl *Create(ASTContext &C, DeclContext *DC,
3356                                    SourceLocation L, const IdentifierInfo *Id,
3357                                    QualType T,
3358                                    llvm::MutableArrayRef<NamedDecl *> CH);
3359 
3360   static IndirectFieldDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
3361 
3362   using chain_iterator = ArrayRef<NamedDecl *>::const_iterator;
3363 
3364   ArrayRef<NamedDecl *> chain() const {
3365     return llvm::ArrayRef(Chaining, ChainingSize);
3366   }
3367   chain_iterator chain_begin() const { return chain().begin(); }
3368   chain_iterator chain_end() const { return chain().end(); }
3369 
3370   unsigned getChainingSize() const { return ChainingSize; }
3371 
3372   FieldDecl *getAnonField() const {
3373     assert(chain().size() >= 2);
3374     return cast<FieldDecl>(chain().back());
3375   }
3376 
3377   VarDecl *getVarDecl() const {
3378     assert(chain().size() >= 2);
3379     return dyn_cast<VarDecl>(chain().front());
3380   }
3381 
3382   IndirectFieldDecl *getCanonicalDecl() override { return getFirstDecl(); }
3383   const IndirectFieldDecl *getCanonicalDecl() const { return getFirstDecl(); }
3384 
3385   // Implement isa/cast/dyncast/etc.
3386   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3387   static bool classofKind(Kind K) { return K == IndirectField; }
3388 };
3389 
3390 /// Represents a declaration of a type.
3391 class TypeDecl : public NamedDecl {
3392   friend class ASTContext;
3393   friend class ASTReader;
3394 
3395   /// This indicates the Type object that represents
3396   /// this TypeDecl.  It is a cache maintained by
3397   /// ASTContext::getTypedefType, ASTContext::getTagDeclType, and
3398   /// ASTContext::getTemplateTypeParmType, and TemplateTypeParmDecl.
3399   mutable const Type *TypeForDecl = nullptr;
3400 
3401   /// The start of the source range for this declaration.
3402   SourceLocation LocStart;
3403 
3404   void anchor() override;
3405 
3406 protected:
3407   TypeDecl(Kind DK, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id,
3408            SourceLocation StartL = SourceLocation())
3409       : NamedDecl(DK, DC, L, Id), LocStart(StartL) {}
3410 
3411 public:
3412   // Low-level accessor. If you just want the type defined by this node,
3413   // check out ASTContext::getTypeDeclType or one of
3414   // ASTContext::getTypedefType, ASTContext::getRecordType, etc. if you
3415   // already know the specific kind of node this is.
3416   const Type *getTypeForDecl() const { return TypeForDecl; }
3417   void setTypeForDecl(const Type *TD) { TypeForDecl = TD; }
3418 
3419   SourceLocation getBeginLoc() const LLVM_READONLY { return LocStart; }
3420   void setLocStart(SourceLocation L) { LocStart = L; }
3421   SourceRange getSourceRange() const override LLVM_READONLY {
3422     if (LocStart.isValid())
3423       return SourceRange(LocStart, getLocation());
3424     else
3425       return SourceRange(getLocation());
3426   }
3427 
3428   // Implement isa/cast/dyncast/etc.
3429   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3430   static bool classofKind(Kind K) { return K >= firstType && K <= lastType; }
3431 };
3432 
3433 /// Base class for declarations which introduce a typedef-name.
3434 class TypedefNameDecl : public TypeDecl, public Redeclarable<TypedefNameDecl> {
3435   struct alignas(8) ModedTInfo {
3436     TypeSourceInfo *first;
3437     QualType second;
3438   };
3439 
3440   /// If int part is 0, we have not computed IsTransparentTag.
3441   /// Otherwise, IsTransparentTag is (getInt() >> 1).
3442   mutable llvm::PointerIntPair<
3443       llvm::PointerUnion<TypeSourceInfo *, ModedTInfo *>, 2>
3444       MaybeModedTInfo;
3445 
3446   void anchor() override;
3447 
3448 protected:
3449   TypedefNameDecl(Kind DK, ASTContext &C, DeclContext *DC,
3450                   SourceLocation StartLoc, SourceLocation IdLoc,
3451                   const IdentifierInfo *Id, TypeSourceInfo *TInfo)
3452       : TypeDecl(DK, DC, IdLoc, Id, StartLoc), redeclarable_base(C),
3453         MaybeModedTInfo(TInfo, 0) {}
3454 
3455   using redeclarable_base = Redeclarable<TypedefNameDecl>;
3456 
3457   TypedefNameDecl *getNextRedeclarationImpl() override {
3458     return getNextRedeclaration();
3459   }
3460 
3461   TypedefNameDecl *getPreviousDeclImpl() override {
3462     return getPreviousDecl();
3463   }
3464 
3465   TypedefNameDecl *getMostRecentDeclImpl() override {
3466     return getMostRecentDecl();
3467   }
3468 
3469 public:
3470   using redecl_range = redeclarable_base::redecl_range;
3471   using redecl_iterator = redeclarable_base::redecl_iterator;
3472 
3473   using redeclarable_base::redecls_begin;
3474   using redeclarable_base::redecls_end;
3475   using redeclarable_base::redecls;
3476   using redeclarable_base::getPreviousDecl;
3477   using redeclarable_base::getMostRecentDecl;
3478   using redeclarable_base::isFirstDecl;
3479 
3480   bool isModed() const {
3481     return isa<ModedTInfo *>(MaybeModedTInfo.getPointer());
3482   }
3483 
3484   TypeSourceInfo *getTypeSourceInfo() const {
3485     return isModed() ? cast<ModedTInfo *>(MaybeModedTInfo.getPointer())->first
3486                      : cast<TypeSourceInfo *>(MaybeModedTInfo.getPointer());
3487   }
3488 
3489   QualType getUnderlyingType() const {
3490     return isModed() ? cast<ModedTInfo *>(MaybeModedTInfo.getPointer())->second
3491                      : cast<TypeSourceInfo *>(MaybeModedTInfo.getPointer())
3492                            ->getType();
3493   }
3494 
3495   void setTypeSourceInfo(TypeSourceInfo *newType) {
3496     MaybeModedTInfo.setPointer(newType);
3497   }
3498 
3499   void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy) {
3500     MaybeModedTInfo.setPointer(new (getASTContext(), 8)
3501                                    ModedTInfo({unmodedTSI, modedTy}));
3502   }
3503 
3504   /// Retrieves the canonical declaration of this typedef-name.
3505   TypedefNameDecl *getCanonicalDecl() override { return getFirstDecl(); }
3506   const TypedefNameDecl *getCanonicalDecl() const { return getFirstDecl(); }
3507 
3508   /// Retrieves the tag declaration for which this is the typedef name for
3509   /// linkage purposes, if any.
3510   ///
3511   /// \param AnyRedecl Look for the tag declaration in any redeclaration of
3512   /// this typedef declaration.
3513   TagDecl *getAnonDeclWithTypedefName(bool AnyRedecl = false) const;
3514 
3515   /// Determines if this typedef shares a name and spelling location with its
3516   /// underlying tag type, as is the case with the NS_ENUM macro.
3517   bool isTransparentTag() const {
3518     if (MaybeModedTInfo.getInt())
3519       return MaybeModedTInfo.getInt() & 0x2;
3520     return isTransparentTagSlow();
3521   }
3522 
3523   // Implement isa/cast/dyncast/etc.
3524   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3525   static bool classofKind(Kind K) {
3526     return K >= firstTypedefName && K <= lastTypedefName;
3527   }
3528 
3529 private:
3530   bool isTransparentTagSlow() const;
3531 };
3532 
3533 /// Represents the declaration of a typedef-name via the 'typedef'
3534 /// type specifier.
3535 class TypedefDecl : public TypedefNameDecl {
3536   TypedefDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
3537               SourceLocation IdLoc, const IdentifierInfo *Id,
3538               TypeSourceInfo *TInfo)
3539       : TypedefNameDecl(Typedef, C, DC, StartLoc, IdLoc, Id, TInfo) {}
3540 
3541 public:
3542   static TypedefDecl *Create(ASTContext &C, DeclContext *DC,
3543                              SourceLocation StartLoc, SourceLocation IdLoc,
3544                              const IdentifierInfo *Id, TypeSourceInfo *TInfo);
3545   static TypedefDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
3546 
3547   SourceRange getSourceRange() const override LLVM_READONLY;
3548 
3549   // Implement isa/cast/dyncast/etc.
3550   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3551   static bool classofKind(Kind K) { return K == Typedef; }
3552 };
3553 
3554 /// Represents the declaration of a typedef-name via a C++11
3555 /// alias-declaration.
3556 class TypeAliasDecl : public TypedefNameDecl {
3557   /// The template for which this is the pattern, if any.
3558   TypeAliasTemplateDecl *Template;
3559 
3560   TypeAliasDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
3561                 SourceLocation IdLoc, const IdentifierInfo *Id,
3562                 TypeSourceInfo *TInfo)
3563       : TypedefNameDecl(TypeAlias, C, DC, StartLoc, IdLoc, Id, TInfo),
3564         Template(nullptr) {}
3565 
3566 public:
3567   static TypeAliasDecl *Create(ASTContext &C, DeclContext *DC,
3568                                SourceLocation StartLoc, SourceLocation IdLoc,
3569                                const IdentifierInfo *Id, TypeSourceInfo *TInfo);
3570   static TypeAliasDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
3571 
3572   SourceRange getSourceRange() const override LLVM_READONLY;
3573 
3574   TypeAliasTemplateDecl *getDescribedAliasTemplate() const { return Template; }
3575   void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT) { Template = TAT; }
3576 
3577   // Implement isa/cast/dyncast/etc.
3578   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3579   static bool classofKind(Kind K) { return K == TypeAlias; }
3580 };
3581 
3582 /// Represents the declaration of a struct/union/class/enum.
3583 class TagDecl : public TypeDecl,
3584                 public DeclContext,
3585                 public Redeclarable<TagDecl> {
3586   // This class stores some data in DeclContext::TagDeclBits
3587   // to save some space. Use the provided accessors to access it.
3588 public:
3589   // This is really ugly.
3590   using TagKind = TagTypeKind;
3591 
3592 private:
3593   SourceRange BraceRange;
3594 
3595   // A struct representing syntactic qualifier info,
3596   // to be used for the (uncommon) case of out-of-line declarations.
3597   using ExtInfo = QualifierInfo;
3598 
3599   /// If the (out-of-line) tag declaration name
3600   /// is qualified, it points to the qualifier info (nns and range);
3601   /// otherwise, if the tag declaration is anonymous and it is part of
3602   /// a typedef or alias, it points to the TypedefNameDecl (used for mangling);
3603   /// otherwise, if the tag declaration is anonymous and it is used as a
3604   /// declaration specifier for variables, it points to the first VarDecl (used
3605   /// for mangling);
3606   /// otherwise, it is a null (TypedefNameDecl) pointer.
3607   llvm::PointerUnion<TypedefNameDecl *, ExtInfo *> TypedefNameDeclOrQualifier;
3608 
3609   bool hasExtInfo() const { return isa<ExtInfo *>(TypedefNameDeclOrQualifier); }
3610   ExtInfo *getExtInfo() { return cast<ExtInfo *>(TypedefNameDeclOrQualifier); }
3611   const ExtInfo *getExtInfo() const {
3612     return cast<ExtInfo *>(TypedefNameDeclOrQualifier);
3613   }
3614 
3615 protected:
3616   TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC,
3617           SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl,
3618           SourceLocation StartL);
3619 
3620   using redeclarable_base = Redeclarable<TagDecl>;
3621 
3622   TagDecl *getNextRedeclarationImpl() override {
3623     return getNextRedeclaration();
3624   }
3625 
3626   TagDecl *getPreviousDeclImpl() override {
3627     return getPreviousDecl();
3628   }
3629 
3630   TagDecl *getMostRecentDeclImpl() override {
3631     return getMostRecentDecl();
3632   }
3633 
3634   /// Completes the definition of this tag declaration.
3635   ///
3636   /// This is a helper function for derived classes.
3637   void completeDefinition();
3638 
3639   /// True if this decl is currently being defined.
3640   void setBeingDefined(bool V = true) { TagDeclBits.IsBeingDefined = V; }
3641 
3642   /// Indicates whether it is possible for declarations of this kind
3643   /// to have an out-of-date definition.
3644   ///
3645   /// This option is only enabled when modules are enabled.
3646   void setMayHaveOutOfDateDef(bool V = true) {
3647     TagDeclBits.MayHaveOutOfDateDef = V;
3648   }
3649 
3650 public:
3651   friend class ASTDeclReader;
3652   friend class ASTDeclWriter;
3653 
3654   using redecl_range = redeclarable_base::redecl_range;
3655   using redecl_iterator = redeclarable_base::redecl_iterator;
3656 
3657   using redeclarable_base::redecls_begin;
3658   using redeclarable_base::redecls_end;
3659   using redeclarable_base::redecls;
3660   using redeclarable_base::getPreviousDecl;
3661   using redeclarable_base::getMostRecentDecl;
3662   using redeclarable_base::isFirstDecl;
3663 
3664   SourceRange getBraceRange() const { return BraceRange; }
3665   void setBraceRange(SourceRange R) { BraceRange = R; }
3666 
3667   /// Return SourceLocation representing start of source
3668   /// range ignoring outer template declarations.
3669   SourceLocation getInnerLocStart() const { return getBeginLoc(); }
3670 
3671   /// Return SourceLocation representing start of source
3672   /// range taking into account any outer template declarations.
3673   SourceLocation getOuterLocStart() const;
3674   SourceRange getSourceRange() const override LLVM_READONLY;
3675 
3676   TagDecl *getCanonicalDecl() override;
3677   const TagDecl *getCanonicalDecl() const {
3678     return const_cast<TagDecl*>(this)->getCanonicalDecl();
3679   }
3680 
3681   /// Return true if this declaration is a completion definition of the type.
3682   /// Provided for consistency.
3683   bool isThisDeclarationADefinition() const {
3684     return isCompleteDefinition();
3685   }
3686 
3687   /// Return true if this decl has its body fully specified.
3688   bool isCompleteDefinition() const { return TagDeclBits.IsCompleteDefinition; }
3689 
3690   /// True if this decl has its body fully specified.
3691   void setCompleteDefinition(bool V = true) {
3692     TagDeclBits.IsCompleteDefinition = V;
3693   }
3694 
3695   /// Return true if this complete decl is
3696   /// required to be complete for some existing use.
3697   bool isCompleteDefinitionRequired() const {
3698     return TagDeclBits.IsCompleteDefinitionRequired;
3699   }
3700 
3701   /// True if this complete decl is
3702   /// required to be complete for some existing use.
3703   void setCompleteDefinitionRequired(bool V = true) {
3704     TagDeclBits.IsCompleteDefinitionRequired = V;
3705   }
3706 
3707   /// Return true if this decl is currently being defined.
3708   bool isBeingDefined() const { return TagDeclBits.IsBeingDefined; }
3709 
3710   /// True if this tag declaration is "embedded" (i.e., defined or declared
3711   /// for the very first time) in the syntax of a declarator.
3712   bool isEmbeddedInDeclarator() const {
3713     return TagDeclBits.IsEmbeddedInDeclarator;
3714   }
3715 
3716   /// True if this tag declaration is "embedded" (i.e., defined or declared
3717   /// for the very first time) in the syntax of a declarator.
3718   void setEmbeddedInDeclarator(bool isInDeclarator) {
3719     TagDeclBits.IsEmbeddedInDeclarator = isInDeclarator;
3720   }
3721 
3722   /// True if this tag is free standing, e.g. "struct foo;".
3723   bool isFreeStanding() const { return TagDeclBits.IsFreeStanding; }
3724 
3725   /// True if this tag is free standing, e.g. "struct foo;".
3726   void setFreeStanding(bool isFreeStanding = true) {
3727     TagDeclBits.IsFreeStanding = isFreeStanding;
3728   }
3729 
3730   /// Indicates whether it is possible for declarations of this kind
3731   /// to have an out-of-date definition.
3732   ///
3733   /// This option is only enabled when modules are enabled.
3734   bool mayHaveOutOfDateDef() const { return TagDeclBits.MayHaveOutOfDateDef; }
3735 
3736   /// Whether this declaration declares a type that is
3737   /// dependent, i.e., a type that somehow depends on template
3738   /// parameters.
3739   bool isDependentType() const { return isDependentContext(); }
3740 
3741   /// Whether this declaration was a definition in some module but was forced
3742   /// to be a declaration.
3743   ///
3744   /// Useful for clients checking if a module has a definition of a specific
3745   /// symbol and not interested in the final AST with deduplicated definitions.
3746   bool isThisDeclarationADemotedDefinition() const {
3747     return TagDeclBits.IsThisDeclarationADemotedDefinition;
3748   }
3749 
3750   /// Mark a definition as a declaration and maintain information it _was_
3751   /// a definition.
3752   void demoteThisDefinitionToDeclaration() {
3753     assert(isCompleteDefinition() &&
3754            "Should demote definitions only, not forward declarations");
3755     setCompleteDefinition(false);
3756     TagDeclBits.IsThisDeclarationADemotedDefinition = true;
3757   }
3758 
3759   /// Starts the definition of this tag declaration.
3760   ///
3761   /// This method should be invoked at the beginning of the definition
3762   /// of this tag declaration. It will set the tag type into a state
3763   /// where it is in the process of being defined.
3764   void startDefinition();
3765 
3766   /// Returns the TagDecl that actually defines this
3767   ///  struct/union/class/enum.  When determining whether or not a
3768   ///  struct/union/class/enum has a definition, one should use this
3769   ///  method as opposed to 'isDefinition'.  'isDefinition' indicates
3770   ///  whether or not a specific TagDecl is defining declaration, not
3771   ///  whether or not the struct/union/class/enum type is defined.
3772   ///  This method returns NULL if there is no TagDecl that defines
3773   ///  the struct/union/class/enum.
3774   TagDecl *getDefinition() const;
3775 
3776   StringRef getKindName() const {
3777     return TypeWithKeyword::getTagTypeKindName(getTagKind());
3778   }
3779 
3780   TagKind getTagKind() const {
3781     return static_cast<TagKind>(TagDeclBits.TagDeclKind);
3782   }
3783 
3784   void setTagKind(TagKind TK) {
3785     TagDeclBits.TagDeclKind = llvm::to_underlying(TK);
3786   }
3787 
3788   bool isStruct() const { return getTagKind() == TagTypeKind::Struct; }
3789   bool isInterface() const { return getTagKind() == TagTypeKind::Interface; }
3790   bool isClass() const { return getTagKind() == TagTypeKind::Class; }
3791   bool isUnion() const { return getTagKind() == TagTypeKind::Union; }
3792   bool isEnum() const { return getTagKind() == TagTypeKind::Enum; }
3793 
3794   /// Is this tag type named, either directly or via being defined in
3795   /// a typedef of this type?
3796   ///
3797   /// C++11 [basic.link]p8:
3798   ///   A type is said to have linkage if and only if:
3799   ///     - it is a class or enumeration type that is named (or has a
3800   ///       name for linkage purposes) and the name has linkage; ...
3801   /// C++11 [dcl.typedef]p9:
3802   ///   If the typedef declaration defines an unnamed class (or enum),
3803   ///   the first typedef-name declared by the declaration to be that
3804   ///   class type (or enum type) is used to denote the class type (or
3805   ///   enum type) for linkage purposes only.
3806   ///
3807   /// C does not have an analogous rule, but the same concept is
3808   /// nonetheless useful in some places.
3809   bool hasNameForLinkage() const {
3810     return (getDeclName() || getTypedefNameForAnonDecl());
3811   }
3812 
3813   TypedefNameDecl *getTypedefNameForAnonDecl() const {
3814     return hasExtInfo() ? nullptr
3815                         : cast<TypedefNameDecl *>(TypedefNameDeclOrQualifier);
3816   }
3817 
3818   void setTypedefNameForAnonDecl(TypedefNameDecl *TDD);
3819 
3820   /// Retrieve the nested-name-specifier that qualifies the name of this
3821   /// declaration, if it was present in the source.
3822   NestedNameSpecifier *getQualifier() const {
3823     return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
3824                         : nullptr;
3825   }
3826 
3827   /// Retrieve the nested-name-specifier (with source-location
3828   /// information) that qualifies the name of this declaration, if it was
3829   /// present in the source.
3830   NestedNameSpecifierLoc getQualifierLoc() const {
3831     return hasExtInfo() ? getExtInfo()->QualifierLoc
3832                         : NestedNameSpecifierLoc();
3833   }
3834 
3835   void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc);
3836 
3837   unsigned getNumTemplateParameterLists() const {
3838     return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
3839   }
3840 
3841   TemplateParameterList *getTemplateParameterList(unsigned i) const {
3842     assert(i < getNumTemplateParameterLists());
3843     return getExtInfo()->TemplParamLists[i];
3844   }
3845 
3846   using TypeDecl::printName;
3847   void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override;
3848 
3849   void setTemplateParameterListsInfo(ASTContext &Context,
3850                                      ArrayRef<TemplateParameterList *> TPLists);
3851 
3852   // Implement isa/cast/dyncast/etc.
3853   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
3854   static bool classofKind(Kind K) { return K >= firstTag && K <= lastTag; }
3855 
3856   static DeclContext *castToDeclContext(const TagDecl *D) {
3857     return static_cast<DeclContext *>(const_cast<TagDecl*>(D));
3858   }
3859 
3860   static TagDecl *castFromDeclContext(const DeclContext *DC) {
3861     return static_cast<TagDecl *>(const_cast<DeclContext*>(DC));
3862   }
3863 };
3864 
3865 /// Represents an enum.  In C++11, enums can be forward-declared
3866 /// with a fixed underlying type, and in C we allow them to be forward-declared
3867 /// with no underlying type as an extension.
3868 class EnumDecl : public TagDecl {
3869   // This class stores some data in DeclContext::EnumDeclBits
3870   // to save some space. Use the provided accessors to access it.
3871 
3872   /// This represent the integer type that the enum corresponds
3873   /// to for code generation purposes.  Note that the enumerator constants may
3874   /// have a different type than this does.
3875   ///
3876   /// If the underlying integer type was explicitly stated in the source
3877   /// code, this is a TypeSourceInfo* for that type. Otherwise this type
3878   /// was automatically deduced somehow, and this is a Type*.
3879   ///
3880   /// Normally if IsFixed(), this would contain a TypeSourceInfo*, but in
3881   /// some cases it won't.
3882   ///
3883   /// The underlying type of an enumeration never has any qualifiers, so
3884   /// we can get away with just storing a raw Type*, and thus save an
3885   /// extra pointer when TypeSourceInfo is needed.
3886   llvm::PointerUnion<const Type *, TypeSourceInfo *> IntegerType;
3887 
3888   /// The integer type that values of this type should
3889   /// promote to.  In C, enumerators are generally of an integer type
3890   /// directly, but gcc-style large enumerators (and all enumerators
3891   /// in C++) are of the enum type instead.
3892   QualType PromotionType;
3893 
3894   /// If this enumeration is an instantiation of a member enumeration
3895   /// of a class template specialization, this is the member specialization
3896   /// information.
3897   MemberSpecializationInfo *SpecializationInfo = nullptr;
3898 
3899   /// Store the ODRHash after first calculation.
3900   /// The corresponding flag HasODRHash is in EnumDeclBits
3901   /// and can be accessed with the provided accessors.
3902   unsigned ODRHash;
3903 
3904   EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
3905            SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl,
3906            bool Scoped, bool ScopedUsingClassTag, bool Fixed);
3907 
3908   void anchor() override;
3909 
3910   void setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED,
3911                                     TemplateSpecializationKind TSK);
3912 
3913   /// Sets the width in bits required to store all the
3914   /// non-negative enumerators of this enum.
3915   void setNumPositiveBits(unsigned Num) {
3916     EnumDeclBits.NumPositiveBits = Num;
3917     assert(EnumDeclBits.NumPositiveBits == Num && "can't store this bitcount");
3918   }
3919 
3920   /// Returns the width in bits required to store all the
3921   /// negative enumerators of this enum. (see getNumNegativeBits)
3922   void setNumNegativeBits(unsigned Num) { EnumDeclBits.NumNegativeBits = Num; }
3923 
3924 public:
3925   /// True if this tag declaration is a scoped enumeration. Only
3926   /// possible in C++11 mode.
3927   void setScoped(bool Scoped = true) { EnumDeclBits.IsScoped = Scoped; }
3928 
3929   /// If this tag declaration is a scoped enum,
3930   /// then this is true if the scoped enum was declared using the class
3931   /// tag, false if it was declared with the struct tag. No meaning is
3932   /// associated if this tag declaration is not a scoped enum.
3933   void setScopedUsingClassTag(bool ScopedUCT = true) {
3934     EnumDeclBits.IsScopedUsingClassTag = ScopedUCT;
3935   }
3936 
3937   /// True if this is an Objective-C, C++11, or
3938   /// Microsoft-style enumeration with a fixed underlying type.
3939   void setFixed(bool Fixed = true) { EnumDeclBits.IsFixed = Fixed; }
3940 
3941 private:
3942   /// True if a valid hash is stored in ODRHash.
3943   bool hasODRHash() const { return EnumDeclBits.HasODRHash; }
3944   void setHasODRHash(bool Hash = true) { EnumDeclBits.HasODRHash = Hash; }
3945 
3946 public:
3947   friend class ASTDeclReader;
3948 
3949   EnumDecl *getCanonicalDecl() override {
3950     return cast<EnumDecl>(TagDecl::getCanonicalDecl());
3951   }
3952   const EnumDecl *getCanonicalDecl() const {
3953     return const_cast<EnumDecl*>(this)->getCanonicalDecl();
3954   }
3955 
3956   EnumDecl *getPreviousDecl() {
3957     return cast_or_null<EnumDecl>(
3958             static_cast<TagDecl *>(this)->getPreviousDecl());
3959   }
3960   const EnumDecl *getPreviousDecl() const {
3961     return const_cast<EnumDecl*>(this)->getPreviousDecl();
3962   }
3963 
3964   EnumDecl *getMostRecentDecl() {
3965     return cast<EnumDecl>(static_cast<TagDecl *>(this)->getMostRecentDecl());
3966   }
3967   const EnumDecl *getMostRecentDecl() const {
3968     return const_cast<EnumDecl*>(this)->getMostRecentDecl();
3969   }
3970 
3971   EnumDecl *getDefinition() const {
3972     return cast_or_null<EnumDecl>(TagDecl::getDefinition());
3973   }
3974 
3975   static EnumDecl *Create(ASTContext &C, DeclContext *DC,
3976                           SourceLocation StartLoc, SourceLocation IdLoc,
3977                           IdentifierInfo *Id, EnumDecl *PrevDecl,
3978                           bool IsScoped, bool IsScopedUsingClassTag,
3979                           bool IsFixed);
3980   static EnumDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
3981 
3982   /// Overrides to provide correct range when there's an enum-base specifier
3983   /// with forward declarations.
3984   SourceRange getSourceRange() const override LLVM_READONLY;
3985 
3986   /// When created, the EnumDecl corresponds to a
3987   /// forward-declared enum. This method is used to mark the
3988   /// declaration as being defined; its enumerators have already been
3989   /// added (via DeclContext::addDecl). NewType is the new underlying
3990   /// type of the enumeration type.
3991   void completeDefinition(QualType NewType,
3992                           QualType PromotionType,
3993                           unsigned NumPositiveBits,
3994                           unsigned NumNegativeBits);
3995 
3996   // Iterates through the enumerators of this enumeration.
3997   using enumerator_iterator = specific_decl_iterator<EnumConstantDecl>;
3998   using enumerator_range =
3999       llvm::iterator_range<specific_decl_iterator<EnumConstantDecl>>;
4000 
4001   enumerator_range enumerators() const {
4002     return enumerator_range(enumerator_begin(), enumerator_end());
4003   }
4004 
4005   enumerator_iterator enumerator_begin() const {
4006     const EnumDecl *E = getDefinition();
4007     if (!E)
4008       E = this;
4009     return enumerator_iterator(E->decls_begin());
4010   }
4011 
4012   enumerator_iterator enumerator_end() const {
4013     const EnumDecl *E = getDefinition();
4014     if (!E)
4015       E = this;
4016     return enumerator_iterator(E->decls_end());
4017   }
4018 
4019   /// Return the integer type that enumerators should promote to.
4020   QualType getPromotionType() const { return PromotionType; }
4021 
4022   /// Set the promotion type.
4023   void setPromotionType(QualType T) { PromotionType = T; }
4024 
4025   /// Return the integer type this enum decl corresponds to.
4026   /// This returns a null QualType for an enum forward definition with no fixed
4027   /// underlying type.
4028   QualType getIntegerType() const {
4029     if (!IntegerType)
4030       return QualType();
4031     if (const Type *T = dyn_cast<const Type *>(IntegerType))
4032       return QualType(T, 0);
4033     return cast<TypeSourceInfo *>(IntegerType)->getType().getUnqualifiedType();
4034   }
4035 
4036   /// Set the underlying integer type.
4037   void setIntegerType(QualType T) { IntegerType = T.getTypePtrOrNull(); }
4038 
4039   /// Set the underlying integer type source info.
4040   void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo) { IntegerType = TInfo; }
4041 
4042   /// Return the type source info for the underlying integer type,
4043   /// if no type source info exists, return 0.
4044   TypeSourceInfo *getIntegerTypeSourceInfo() const {
4045     return dyn_cast_if_present<TypeSourceInfo *>(IntegerType);
4046   }
4047 
4048   /// Retrieve the source range that covers the underlying type if
4049   /// specified.
4050   SourceRange getIntegerTypeRange() const LLVM_READONLY;
4051 
4052   /// Returns the width in bits required to store all the
4053   /// non-negative enumerators of this enum.
4054   unsigned getNumPositiveBits() const { return EnumDeclBits.NumPositiveBits; }
4055 
4056   /// Returns the width in bits required to store all the
4057   /// negative enumerators of this enum.  These widths include
4058   /// the rightmost leading 1;  that is:
4059   ///
4060   /// MOST NEGATIVE ENUMERATOR     PATTERN     NUM NEGATIVE BITS
4061   /// ------------------------     -------     -----------------
4062   ///                       -1     1111111                     1
4063   ///                      -10     1110110                     5
4064   ///                     -101     1001011                     8
4065   unsigned getNumNegativeBits() const { return EnumDeclBits.NumNegativeBits; }
4066 
4067   /// Calculates the [Min,Max) values the enum can store based on the
4068   /// NumPositiveBits and NumNegativeBits. This matters for enums that do not
4069   /// have a fixed underlying type.
4070   void getValueRange(llvm::APInt &Max, llvm::APInt &Min) const;
4071 
4072   /// Returns true if this is a C++11 scoped enumeration.
4073   bool isScoped() const { return EnumDeclBits.IsScoped; }
4074 
4075   /// Returns true if this is a C++11 scoped enumeration.
4076   bool isScopedUsingClassTag() const {
4077     return EnumDeclBits.IsScopedUsingClassTag;
4078   }
4079 
4080   /// Returns true if this is an Objective-C, C++11, or
4081   /// Microsoft-style enumeration with a fixed underlying type.
4082   bool isFixed() const { return EnumDeclBits.IsFixed; }
4083 
4084   unsigned getODRHash();
4085 
4086   /// Returns true if this can be considered a complete type.
4087   bool isComplete() const {
4088     // IntegerType is set for fixed type enums and non-fixed but implicitly
4089     // int-sized Microsoft enums.
4090     return isCompleteDefinition() || IntegerType;
4091   }
4092 
4093   /// Returns true if this enum is either annotated with
4094   /// enum_extensibility(closed) or isn't annotated with enum_extensibility.
4095   bool isClosed() const;
4096 
4097   /// Returns true if this enum is annotated with flag_enum and isn't annotated
4098   /// with enum_extensibility(open).
4099   bool isClosedFlag() const;
4100 
4101   /// Returns true if this enum is annotated with neither flag_enum nor
4102   /// enum_extensibility(open).
4103   bool isClosedNonFlag() const;
4104 
4105   /// Retrieve the enum definition from which this enumeration could
4106   /// be instantiated, if it is an instantiation (rather than a non-template).
4107   EnumDecl *getTemplateInstantiationPattern() const;
4108 
4109   /// Returns the enumeration (declared within the template)
4110   /// from which this enumeration type was instantiated, or NULL if
4111   /// this enumeration was not instantiated from any template.
4112   EnumDecl *getInstantiatedFromMemberEnum() const;
4113 
4114   /// If this enumeration is a member of a specialization of a
4115   /// templated class, determine what kind of template specialization
4116   /// or instantiation this is.
4117   TemplateSpecializationKind getTemplateSpecializationKind() const;
4118 
4119   /// For an enumeration member that was instantiated from a member
4120   /// enumeration of a templated class, set the template specialiation kind.
4121   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
4122                         SourceLocation PointOfInstantiation = SourceLocation());
4123 
4124   /// If this enumeration is an instantiation of a member enumeration of
4125   /// a class template specialization, retrieves the member specialization
4126   /// information.
4127   MemberSpecializationInfo *getMemberSpecializationInfo() const {
4128     return SpecializationInfo;
4129   }
4130 
4131   /// Specify that this enumeration is an instantiation of the
4132   /// member enumeration ED.
4133   void setInstantiationOfMemberEnum(EnumDecl *ED,
4134                                     TemplateSpecializationKind TSK) {
4135     setInstantiationOfMemberEnum(getASTContext(), ED, TSK);
4136   }
4137 
4138   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4139   static bool classofKind(Kind K) { return K == Enum; }
4140 };
4141 
4142 /// Enum that represents the different ways arguments are passed to and
4143 /// returned from function calls. This takes into account the target-specific
4144 /// and version-specific rules along with the rules determined by the
4145 /// language.
4146 enum class RecordArgPassingKind {
4147   /// The argument of this type can be passed directly in registers.
4148   CanPassInRegs,
4149 
4150   /// The argument of this type cannot be passed directly in registers.
4151   /// Records containing this type as a subobject are not forced to be passed
4152   /// indirectly. This value is used only in C++. This value is required by
4153   /// C++ because, in uncommon situations, it is possible for a class to have
4154   /// only trivial copy/move constructors even when one of its subobjects has
4155   /// a non-trivial copy/move constructor (if e.g. the corresponding copy/move
4156   /// constructor in the derived class is deleted).
4157   CannotPassInRegs,
4158 
4159   /// The argument of this type cannot be passed directly in registers.
4160   /// Records containing this type as a subobject are forced to be passed
4161   /// indirectly.
4162   CanNeverPassInRegs
4163 };
4164 
4165 /// Represents a struct/union/class.  For example:
4166 ///   struct X;                  // Forward declaration, no "body".
4167 ///   union Y { int A, B; };     // Has body with members A and B (FieldDecls).
4168 /// This decl will be marked invalid if *any* members are invalid.
4169 class RecordDecl : public TagDecl {
4170   // This class stores some data in DeclContext::RecordDeclBits
4171   // to save some space. Use the provided accessors to access it.
4172 public:
4173   friend class DeclContext;
4174   friend class ASTDeclReader;
4175 
4176 protected:
4177   RecordDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC,
4178              SourceLocation StartLoc, SourceLocation IdLoc,
4179              IdentifierInfo *Id, RecordDecl *PrevDecl);
4180 
4181 public:
4182   static RecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
4183                             SourceLocation StartLoc, SourceLocation IdLoc,
4184                             IdentifierInfo *Id, RecordDecl* PrevDecl = nullptr);
4185   static RecordDecl *CreateDeserialized(const ASTContext &C, GlobalDeclID ID);
4186 
4187   RecordDecl *getPreviousDecl() {
4188     return cast_or_null<RecordDecl>(
4189             static_cast<TagDecl *>(this)->getPreviousDecl());
4190   }
4191   const RecordDecl *getPreviousDecl() const {
4192     return const_cast<RecordDecl*>(this)->getPreviousDecl();
4193   }
4194 
4195   RecordDecl *getMostRecentDecl() {
4196     return cast<RecordDecl>(static_cast<TagDecl *>(this)->getMostRecentDecl());
4197   }
4198   const RecordDecl *getMostRecentDecl() const {
4199     return const_cast<RecordDecl*>(this)->getMostRecentDecl();
4200   }
4201 
4202   bool hasFlexibleArrayMember() const {
4203     return RecordDeclBits.HasFlexibleArrayMember;
4204   }
4205 
4206   void setHasFlexibleArrayMember(bool V) {
4207     RecordDeclBits.HasFlexibleArrayMember = V;
4208   }
4209 
4210   /// Whether this is an anonymous struct or union. To be an anonymous
4211   /// struct or union, it must have been declared without a name and
4212   /// there must be no objects of this type declared, e.g.,
4213   /// @code
4214   ///   union { int i; float f; };
4215   /// @endcode
4216   /// is an anonymous union but neither of the following are:
4217   /// @code
4218   ///  union X { int i; float f; };
4219   ///  union { int i; float f; } obj;
4220   /// @endcode
4221   bool isAnonymousStructOrUnion() const {
4222     return RecordDeclBits.AnonymousStructOrUnion;
4223   }
4224 
4225   void setAnonymousStructOrUnion(bool Anon) {
4226     RecordDeclBits.AnonymousStructOrUnion = Anon;
4227   }
4228 
4229   bool hasObjectMember() const { return RecordDeclBits.HasObjectMember; }
4230   void setHasObjectMember(bool val) { RecordDeclBits.HasObjectMember = val; }
4231 
4232   bool hasVolatileMember() const { return RecordDeclBits.HasVolatileMember; }
4233 
4234   void setHasVolatileMember(bool val) {
4235     RecordDeclBits.HasVolatileMember = val;
4236   }
4237 
4238   bool hasLoadedFieldsFromExternalStorage() const {
4239     return RecordDeclBits.LoadedFieldsFromExternalStorage;
4240   }
4241 
4242   void setHasLoadedFieldsFromExternalStorage(bool val) const {
4243     RecordDeclBits.LoadedFieldsFromExternalStorage = val;
4244   }
4245 
4246   /// Functions to query basic properties of non-trivial C structs.
4247   bool isNonTrivialToPrimitiveDefaultInitialize() const {
4248     return RecordDeclBits.NonTrivialToPrimitiveDefaultInitialize;
4249   }
4250 
4251   void setNonTrivialToPrimitiveDefaultInitialize(bool V) {
4252     RecordDeclBits.NonTrivialToPrimitiveDefaultInitialize = V;
4253   }
4254 
4255   bool isNonTrivialToPrimitiveCopy() const {
4256     return RecordDeclBits.NonTrivialToPrimitiveCopy;
4257   }
4258 
4259   void setNonTrivialToPrimitiveCopy(bool V) {
4260     RecordDeclBits.NonTrivialToPrimitiveCopy = V;
4261   }
4262 
4263   bool isNonTrivialToPrimitiveDestroy() const {
4264     return RecordDeclBits.NonTrivialToPrimitiveDestroy;
4265   }
4266 
4267   void setNonTrivialToPrimitiveDestroy(bool V) {
4268     RecordDeclBits.NonTrivialToPrimitiveDestroy = V;
4269   }
4270 
4271   bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const {
4272     return RecordDeclBits.HasNonTrivialToPrimitiveDefaultInitializeCUnion;
4273   }
4274 
4275   void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V) {
4276     RecordDeclBits.HasNonTrivialToPrimitiveDefaultInitializeCUnion = V;
4277   }
4278 
4279   bool hasNonTrivialToPrimitiveDestructCUnion() const {
4280     return RecordDeclBits.HasNonTrivialToPrimitiveDestructCUnion;
4281   }
4282 
4283   void setHasNonTrivialToPrimitiveDestructCUnion(bool V) {
4284     RecordDeclBits.HasNonTrivialToPrimitiveDestructCUnion = V;
4285   }
4286 
4287   bool hasNonTrivialToPrimitiveCopyCUnion() const {
4288     return RecordDeclBits.HasNonTrivialToPrimitiveCopyCUnion;
4289   }
4290 
4291   void setHasNonTrivialToPrimitiveCopyCUnion(bool V) {
4292     RecordDeclBits.HasNonTrivialToPrimitiveCopyCUnion = V;
4293   }
4294 
4295   bool hasUninitializedExplicitInitFields() const {
4296     return RecordDeclBits.HasUninitializedExplicitInitFields;
4297   }
4298 
4299   void setHasUninitializedExplicitInitFields(bool V) {
4300     RecordDeclBits.HasUninitializedExplicitInitFields = V;
4301   }
4302 
4303   /// Determine whether this class can be passed in registers. In C++ mode,
4304   /// it must have at least one trivial, non-deleted copy or move constructor.
4305   /// FIXME: This should be set as part of completeDefinition.
4306   bool canPassInRegisters() const {
4307     return getArgPassingRestrictions() == RecordArgPassingKind::CanPassInRegs;
4308   }
4309 
4310   RecordArgPassingKind getArgPassingRestrictions() const {
4311     return static_cast<RecordArgPassingKind>(
4312         RecordDeclBits.ArgPassingRestrictions);
4313   }
4314 
4315   void setArgPassingRestrictions(RecordArgPassingKind Kind) {
4316     RecordDeclBits.ArgPassingRestrictions = llvm::to_underlying(Kind);
4317   }
4318 
4319   bool isParamDestroyedInCallee() const {
4320     return RecordDeclBits.ParamDestroyedInCallee;
4321   }
4322 
4323   void setParamDestroyedInCallee(bool V) {
4324     RecordDeclBits.ParamDestroyedInCallee = V;
4325   }
4326 
4327   bool isRandomized() const { return RecordDeclBits.IsRandomized; }
4328 
4329   void setIsRandomized(bool V) { RecordDeclBits.IsRandomized = V; }
4330 
4331   void reorderDecls(const SmallVectorImpl<Decl *> &Decls);
4332 
4333   /// Determines whether this declaration represents the
4334   /// injected class name.
4335   ///
4336   /// The injected class name in C++ is the name of the class that
4337   /// appears inside the class itself. For example:
4338   ///
4339   /// \code
4340   /// struct C {
4341   ///   // C is implicitly declared here as a synonym for the class name.
4342   /// };
4343   ///
4344   /// C::C c; // same as "C c;"
4345   /// \endcode
4346   bool isInjectedClassName() const;
4347 
4348   /// Determine whether this record is a class describing a lambda
4349   /// function object.
4350   bool isLambda() const;
4351 
4352   /// Determine whether this record is a record for captured variables in
4353   /// CapturedStmt construct.
4354   bool isCapturedRecord() const;
4355 
4356   /// Mark the record as a record for captured variables in CapturedStmt
4357   /// construct.
4358   void setCapturedRecord();
4359 
4360   /// Returns the RecordDecl that actually defines
4361   ///  this struct/union/class.  When determining whether or not a
4362   ///  struct/union/class is completely defined, one should use this
4363   ///  method as opposed to 'isCompleteDefinition'.
4364   ///  'isCompleteDefinition' indicates whether or not a specific
4365   ///  RecordDecl is a completed definition, not whether or not the
4366   ///  record type is defined.  This method returns NULL if there is
4367   ///  no RecordDecl that defines the struct/union/tag.
4368   RecordDecl *getDefinition() const {
4369     return cast_or_null<RecordDecl>(TagDecl::getDefinition());
4370   }
4371 
4372   /// Returns whether this record is a union, or contains (at any nesting level)
4373   /// a union member. This is used by CMSE to warn about possible information
4374   /// leaks.
4375   bool isOrContainsUnion() const;
4376 
4377   // Iterator access to field members. The field iterator only visits
4378   // the non-static data members of this class, ignoring any static
4379   // data members, functions, constructors, destructors, etc.
4380   using field_iterator = specific_decl_iterator<FieldDecl>;
4381   using field_range = llvm::iterator_range<specific_decl_iterator<FieldDecl>>;
4382 
4383   field_range fields() const { return field_range(field_begin(), field_end()); }
4384   field_iterator field_begin() const;
4385 
4386   field_iterator field_end() const {
4387     return field_iterator(decl_iterator());
4388   }
4389 
4390   // Whether there are any fields (non-static data members) in this record.
4391   bool field_empty() const {
4392     return field_begin() == field_end();
4393   }
4394 
4395   /// Note that the definition of this type is now complete.
4396   virtual void completeDefinition();
4397 
4398   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4399   static bool classofKind(Kind K) {
4400     return K >= firstRecord && K <= lastRecord;
4401   }
4402 
4403   /// Get whether or not this is an ms_struct which can
4404   /// be turned on with an attribute, pragma, or -mms-bitfields
4405   /// commandline option.
4406   bool isMsStruct(const ASTContext &C) const;
4407 
4408   /// Whether we are allowed to insert extra padding between fields.
4409   /// These padding are added to help AddressSanitizer detect
4410   /// intra-object-overflow bugs.
4411   bool mayInsertExtraPadding(bool EmitRemark = false) const;
4412 
4413   /// Finds the first data member which has a name.
4414   /// nullptr is returned if no named data member exists.
4415   const FieldDecl *findFirstNamedDataMember() const;
4416 
4417   /// Get precomputed ODRHash or add a new one.
4418   unsigned getODRHash();
4419 
4420 private:
4421   /// Deserialize just the fields.
4422   void LoadFieldsFromExternalStorage() const;
4423 
4424   /// True if a valid hash is stored in ODRHash.
4425   bool hasODRHash() const { return RecordDeclBits.ODRHash; }
4426   void setODRHash(unsigned Hash) { RecordDeclBits.ODRHash = Hash; }
4427 };
4428 
4429 class FileScopeAsmDecl : public Decl {
4430   StringLiteral *AsmString;
4431   SourceLocation RParenLoc;
4432 
4433   FileScopeAsmDecl(DeclContext *DC, StringLiteral *asmstring,
4434                    SourceLocation StartL, SourceLocation EndL)
4435     : Decl(FileScopeAsm, DC, StartL), AsmString(asmstring), RParenLoc(EndL) {}
4436 
4437   virtual void anchor();
4438 
4439 public:
4440   static FileScopeAsmDecl *Create(ASTContext &C, DeclContext *DC,
4441                                   StringLiteral *Str, SourceLocation AsmLoc,
4442                                   SourceLocation RParenLoc);
4443 
4444   static FileScopeAsmDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
4445 
4446   SourceLocation getAsmLoc() const { return getLocation(); }
4447   SourceLocation getRParenLoc() const { return RParenLoc; }
4448   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4449   SourceRange getSourceRange() const override LLVM_READONLY {
4450     return SourceRange(getAsmLoc(), getRParenLoc());
4451   }
4452 
4453   const StringLiteral *getAsmString() const { return AsmString; }
4454   StringLiteral *getAsmString() { return AsmString; }
4455   void setAsmString(StringLiteral *Asm) { AsmString = Asm; }
4456 
4457   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4458   static bool classofKind(Kind K) { return K == FileScopeAsm; }
4459 };
4460 
4461 /// A declaration that models statements at global scope. This declaration
4462 /// supports incremental and interactive C/C++.
4463 ///
4464 /// \note This is used in libInterpreter, clang -cc1 -fincremental-extensions
4465 /// and in tools such as clang-repl.
4466 class TopLevelStmtDecl : public Decl, public DeclContext {
4467   friend class ASTDeclReader;
4468   friend class ASTDeclWriter;
4469 
4470   Stmt *Statement = nullptr;
4471   bool IsSemiMissing = false;
4472 
4473   TopLevelStmtDecl(DeclContext *DC, SourceLocation L, Stmt *S)
4474       : Decl(TopLevelStmt, DC, L), DeclContext(TopLevelStmt), Statement(S) {}
4475 
4476   virtual void anchor();
4477 
4478 public:
4479   static TopLevelStmtDecl *Create(ASTContext &C, Stmt *Statement);
4480   static TopLevelStmtDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
4481 
4482   SourceRange getSourceRange() const override LLVM_READONLY;
4483   Stmt *getStmt() { return Statement; }
4484   const Stmt *getStmt() const { return Statement; }
4485   void setStmt(Stmt *S);
4486   bool isSemiMissing() const { return IsSemiMissing; }
4487   void setSemiMissing(bool Missing = true) { IsSemiMissing = Missing; }
4488 
4489   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4490   static bool classofKind(Kind K) { return K == TopLevelStmt; }
4491 
4492   static DeclContext *castToDeclContext(const TopLevelStmtDecl *D) {
4493     return static_cast<DeclContext *>(const_cast<TopLevelStmtDecl *>(D));
4494   }
4495   static TopLevelStmtDecl *castFromDeclContext(const DeclContext *DC) {
4496     return static_cast<TopLevelStmtDecl *>(const_cast<DeclContext *>(DC));
4497   }
4498 };
4499 
4500 /// Represents a block literal declaration, which is like an
4501 /// unnamed FunctionDecl.  For example:
4502 /// ^{ statement-body }   or   ^(int arg1, float arg2){ statement-body }
4503 class BlockDecl : public Decl, public DeclContext {
4504   // This class stores some data in DeclContext::BlockDeclBits
4505   // to save some space. Use the provided accessors to access it.
4506 public:
4507   /// A class which contains all the information about a particular
4508   /// captured value.
4509   class Capture {
4510     enum {
4511       flag_isByRef = 0x1,
4512       flag_isNested = 0x2
4513     };
4514 
4515     /// The variable being captured.
4516     llvm::PointerIntPair<VarDecl*, 2> VariableAndFlags;
4517 
4518     /// The copy expression, expressed in terms of a DeclRef (or
4519     /// BlockDeclRef) to the captured variable.  Only required if the
4520     /// variable has a C++ class type.
4521     Expr *CopyExpr;
4522 
4523   public:
4524     Capture(VarDecl *variable, bool byRef, bool nested, Expr *copy)
4525       : VariableAndFlags(variable,
4526                   (byRef ? flag_isByRef : 0) | (nested ? flag_isNested : 0)),
4527         CopyExpr(copy) {}
4528 
4529     /// The variable being captured.
4530     VarDecl *getVariable() const { return VariableAndFlags.getPointer(); }
4531 
4532     /// Whether this is a "by ref" capture, i.e. a capture of a __block
4533     /// variable.
4534     bool isByRef() const { return VariableAndFlags.getInt() & flag_isByRef; }
4535 
4536     bool isEscapingByref() const {
4537       return getVariable()->isEscapingByref();
4538     }
4539 
4540     bool isNonEscapingByref() const {
4541       return getVariable()->isNonEscapingByref();
4542     }
4543 
4544     /// Whether this is a nested capture, i.e. the variable captured
4545     /// is not from outside the immediately enclosing function/block.
4546     bool isNested() const { return VariableAndFlags.getInt() & flag_isNested; }
4547 
4548     bool hasCopyExpr() const { return CopyExpr != nullptr; }
4549     Expr *getCopyExpr() const { return CopyExpr; }
4550     void setCopyExpr(Expr *e) { CopyExpr = e; }
4551   };
4552 
4553 private:
4554   /// A new[]'d array of pointers to ParmVarDecls for the formal
4555   /// parameters of this function.  This is null if a prototype or if there are
4556   /// no formals.
4557   ParmVarDecl **ParamInfo = nullptr;
4558   unsigned NumParams = 0;
4559 
4560   Stmt *Body = nullptr;
4561   TypeSourceInfo *SignatureAsWritten = nullptr;
4562 
4563   const Capture *Captures = nullptr;
4564   unsigned NumCaptures = 0;
4565 
4566   unsigned ManglingNumber = 0;
4567   Decl *ManglingContextDecl = nullptr;
4568 
4569 protected:
4570   BlockDecl(DeclContext *DC, SourceLocation CaretLoc);
4571 
4572 public:
4573   static BlockDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L);
4574   static BlockDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
4575 
4576   SourceLocation getCaretLocation() const { return getLocation(); }
4577 
4578   bool isVariadic() const { return BlockDeclBits.IsVariadic; }
4579   void setIsVariadic(bool value) { BlockDeclBits.IsVariadic = value; }
4580 
4581   CompoundStmt *getCompoundBody() const { return (CompoundStmt*) Body; }
4582   Stmt *getBody() const override { return (Stmt*) Body; }
4583   void setBody(CompoundStmt *B) { Body = (Stmt*) B; }
4584 
4585   void setSignatureAsWritten(TypeSourceInfo *Sig) { SignatureAsWritten = Sig; }
4586   TypeSourceInfo *getSignatureAsWritten() const { return SignatureAsWritten; }
4587 
4588   // ArrayRef access to formal parameters.
4589   ArrayRef<ParmVarDecl *> parameters() const {
4590     return {ParamInfo, getNumParams()};
4591   }
4592   MutableArrayRef<ParmVarDecl *> parameters() {
4593     return {ParamInfo, getNumParams()};
4594   }
4595 
4596   // Iterator access to formal parameters.
4597   using param_iterator = MutableArrayRef<ParmVarDecl *>::iterator;
4598   using param_const_iterator = ArrayRef<ParmVarDecl *>::const_iterator;
4599 
4600   bool param_empty() const { return parameters().empty(); }
4601   param_iterator param_begin() { return parameters().begin(); }
4602   param_iterator param_end() { return parameters().end(); }
4603   param_const_iterator param_begin() const { return parameters().begin(); }
4604   param_const_iterator param_end() const { return parameters().end(); }
4605   size_t param_size() const { return parameters().size(); }
4606 
4607   unsigned getNumParams() const { return NumParams; }
4608 
4609   const ParmVarDecl *getParamDecl(unsigned i) const {
4610     assert(i < getNumParams() && "Illegal param #");
4611     return ParamInfo[i];
4612   }
4613   ParmVarDecl *getParamDecl(unsigned i) {
4614     assert(i < getNumParams() && "Illegal param #");
4615     return ParamInfo[i];
4616   }
4617 
4618   void setParams(ArrayRef<ParmVarDecl *> NewParamInfo);
4619 
4620   /// True if this block (or its nested blocks) captures
4621   /// anything of local storage from its enclosing scopes.
4622   bool hasCaptures() const { return NumCaptures || capturesCXXThis(); }
4623 
4624   /// Returns the number of captured variables.
4625   /// Does not include an entry for 'this'.
4626   unsigned getNumCaptures() const { return NumCaptures; }
4627 
4628   using capture_const_iterator = ArrayRef<Capture>::const_iterator;
4629 
4630   ArrayRef<Capture> captures() const { return {Captures, NumCaptures}; }
4631 
4632   capture_const_iterator capture_begin() const { return captures().begin(); }
4633   capture_const_iterator capture_end() const { return captures().end(); }
4634 
4635   bool capturesCXXThis() const { return BlockDeclBits.CapturesCXXThis; }
4636   void setCapturesCXXThis(bool B = true) { BlockDeclBits.CapturesCXXThis = B; }
4637 
4638   bool blockMissingReturnType() const {
4639     return BlockDeclBits.BlockMissingReturnType;
4640   }
4641 
4642   void setBlockMissingReturnType(bool val = true) {
4643     BlockDeclBits.BlockMissingReturnType = val;
4644   }
4645 
4646   bool isConversionFromLambda() const {
4647     return BlockDeclBits.IsConversionFromLambda;
4648   }
4649 
4650   void setIsConversionFromLambda(bool val = true) {
4651     BlockDeclBits.IsConversionFromLambda = val;
4652   }
4653 
4654   bool doesNotEscape() const { return BlockDeclBits.DoesNotEscape; }
4655   void setDoesNotEscape(bool B = true) { BlockDeclBits.DoesNotEscape = B; }
4656 
4657   bool canAvoidCopyToHeap() const {
4658     return BlockDeclBits.CanAvoidCopyToHeap;
4659   }
4660   void setCanAvoidCopyToHeap(bool B = true) {
4661     BlockDeclBits.CanAvoidCopyToHeap = B;
4662   }
4663 
4664   bool capturesVariable(const VarDecl *var) const;
4665 
4666   void setCaptures(ASTContext &Context, ArrayRef<Capture> Captures,
4667                    bool CapturesCXXThis);
4668 
4669   unsigned getBlockManglingNumber() const { return ManglingNumber; }
4670 
4671   Decl *getBlockManglingContextDecl() const { return ManglingContextDecl; }
4672 
4673   void setBlockMangling(unsigned Number, Decl *Ctx) {
4674     ManglingNumber = Number;
4675     ManglingContextDecl = Ctx;
4676   }
4677 
4678   SourceRange getSourceRange() const override LLVM_READONLY;
4679 
4680   FunctionEffectsRef getFunctionEffects() const {
4681     if (const TypeSourceInfo *TSI = getSignatureAsWritten())
4682       if (const auto *FPT = TSI->getType()->getAs<FunctionProtoType>())
4683         return FPT->getFunctionEffects();
4684     return {};
4685   }
4686 
4687   // Implement isa/cast/dyncast/etc.
4688   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4689   static bool classofKind(Kind K) { return K == Block; }
4690   static DeclContext *castToDeclContext(const BlockDecl *D) {
4691     return static_cast<DeclContext *>(const_cast<BlockDecl*>(D));
4692   }
4693   static BlockDecl *castFromDeclContext(const DeclContext *DC) {
4694     return static_cast<BlockDecl *>(const_cast<DeclContext*>(DC));
4695   }
4696 };
4697 
4698 /// Represents a partial function definition.
4699 ///
4700 /// An outlined function declaration contains the parameters and body of
4701 /// a function independent of other function definition concerns such
4702 /// as function name, type, and calling convention. Such declarations may
4703 /// be used to hold a parameterized and transformed sequence of statements
4704 /// used to generate a target dependent function definition without losing
4705 /// association with the original statements. See SYCLKernelCallStmt as an
4706 /// example.
4707 class OutlinedFunctionDecl final
4708     : public Decl,
4709       public DeclContext,
4710       private llvm::TrailingObjects<OutlinedFunctionDecl, ImplicitParamDecl *> {
4711 private:
4712   /// The number of parameters to the outlined function.
4713   unsigned NumParams;
4714 
4715   /// The body of the outlined function.
4716   llvm::PointerIntPair<Stmt *, 1, bool> BodyAndNothrow;
4717 
4718   explicit OutlinedFunctionDecl(DeclContext *DC, unsigned NumParams);
4719 
4720   ImplicitParamDecl *const *getParams() const {
4721     return getTrailingObjects<ImplicitParamDecl *>();
4722   }
4723 
4724   ImplicitParamDecl **getParams() {
4725     return getTrailingObjects<ImplicitParamDecl *>();
4726   }
4727 
4728 public:
4729   friend class ASTDeclReader;
4730   friend class ASTDeclWriter;
4731   friend TrailingObjects;
4732 
4733   static OutlinedFunctionDecl *Create(ASTContext &C, DeclContext *DC,
4734                                       unsigned NumParams);
4735   static OutlinedFunctionDecl *
4736   CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams);
4737 
4738   Stmt *getBody() const override;
4739   void setBody(Stmt *B);
4740 
4741   bool isNothrow() const;
4742   void setNothrow(bool Nothrow = true);
4743 
4744   unsigned getNumParams() const { return NumParams; }
4745 
4746   ImplicitParamDecl *getParam(unsigned i) const {
4747     assert(i < NumParams);
4748     return getParams()[i];
4749   }
4750   void setParam(unsigned i, ImplicitParamDecl *P) {
4751     assert(i < NumParams);
4752     getParams()[i] = P;
4753   }
4754 
4755   // Range interface to parameters.
4756   using parameter_const_iterator = const ImplicitParamDecl *const *;
4757   using parameter_const_range = llvm::iterator_range<parameter_const_iterator>;
4758   parameter_const_range parameters() const {
4759     return {param_begin(), param_end()};
4760   }
4761   parameter_const_iterator param_begin() const { return getParams(); }
4762   parameter_const_iterator param_end() const { return getParams() + NumParams; }
4763 
4764   // Implement isa/cast/dyncast/etc.
4765   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4766   static bool classofKind(Kind K) { return K == OutlinedFunction; }
4767   static DeclContext *castToDeclContext(const OutlinedFunctionDecl *D) {
4768     return static_cast<DeclContext *>(const_cast<OutlinedFunctionDecl *>(D));
4769   }
4770   static OutlinedFunctionDecl *castFromDeclContext(const DeclContext *DC) {
4771     return static_cast<OutlinedFunctionDecl *>(const_cast<DeclContext *>(DC));
4772   }
4773 };
4774 
4775 /// Represents the body of a CapturedStmt, and serves as its DeclContext.
4776 class CapturedDecl final
4777     : public Decl,
4778       public DeclContext,
4779       private llvm::TrailingObjects<CapturedDecl, ImplicitParamDecl *> {
4780 protected:
4781   size_t numTrailingObjects(OverloadToken<ImplicitParamDecl>) {
4782     return NumParams;
4783   }
4784 
4785 private:
4786   /// The number of parameters to the outlined function.
4787   unsigned NumParams;
4788 
4789   /// The position of context parameter in list of parameters.
4790   unsigned ContextParam;
4791 
4792   /// The body of the outlined function.
4793   llvm::PointerIntPair<Stmt *, 1, bool> BodyAndNothrow;
4794 
4795   explicit CapturedDecl(DeclContext *DC, unsigned NumParams);
4796 
4797   ImplicitParamDecl *const *getParams() const {
4798     return getTrailingObjects<ImplicitParamDecl *>();
4799   }
4800 
4801   ImplicitParamDecl **getParams() {
4802     return getTrailingObjects<ImplicitParamDecl *>();
4803   }
4804 
4805 public:
4806   friend class ASTDeclReader;
4807   friend class ASTDeclWriter;
4808   friend TrailingObjects;
4809 
4810   static CapturedDecl *Create(ASTContext &C, DeclContext *DC,
4811                               unsigned NumParams);
4812   static CapturedDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
4813                                           unsigned NumParams);
4814 
4815   Stmt *getBody() const override;
4816   void setBody(Stmt *B);
4817 
4818   bool isNothrow() const;
4819   void setNothrow(bool Nothrow = true);
4820 
4821   unsigned getNumParams() const { return NumParams; }
4822 
4823   ImplicitParamDecl *getParam(unsigned i) const {
4824     assert(i < NumParams);
4825     return getParams()[i];
4826   }
4827   void setParam(unsigned i, ImplicitParamDecl *P) {
4828     assert(i < NumParams);
4829     getParams()[i] = P;
4830   }
4831 
4832   // ArrayRef interface to parameters.
4833   ArrayRef<ImplicitParamDecl *> parameters() const {
4834     return {getParams(), getNumParams()};
4835   }
4836   MutableArrayRef<ImplicitParamDecl *> parameters() {
4837     return {getParams(), getNumParams()};
4838   }
4839 
4840   /// Retrieve the parameter containing captured variables.
4841   ImplicitParamDecl *getContextParam() const {
4842     assert(ContextParam < NumParams);
4843     return getParam(ContextParam);
4844   }
4845   void setContextParam(unsigned i, ImplicitParamDecl *P) {
4846     assert(i < NumParams);
4847     ContextParam = i;
4848     setParam(i, P);
4849   }
4850   unsigned getContextParamPosition() const { return ContextParam; }
4851 
4852   using param_iterator = ImplicitParamDecl *const *;
4853   using param_range = llvm::iterator_range<param_iterator>;
4854 
4855   /// Retrieve an iterator pointing to the first parameter decl.
4856   param_iterator param_begin() const { return getParams(); }
4857   /// Retrieve an iterator one past the last parameter decl.
4858   param_iterator param_end() const { return getParams() + NumParams; }
4859 
4860   // Implement isa/cast/dyncast/etc.
4861   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4862   static bool classofKind(Kind K) { return K == Captured; }
4863   static DeclContext *castToDeclContext(const CapturedDecl *D) {
4864     return static_cast<DeclContext *>(const_cast<CapturedDecl *>(D));
4865   }
4866   static CapturedDecl *castFromDeclContext(const DeclContext *DC) {
4867     return static_cast<CapturedDecl *>(const_cast<DeclContext *>(DC));
4868   }
4869 };
4870 
4871 /// Describes a module import declaration, which makes the contents
4872 /// of the named module visible in the current translation unit.
4873 ///
4874 /// An import declaration imports the named module (or submodule). For example:
4875 /// \code
4876 ///   @import std.vector;
4877 /// \endcode
4878 ///
4879 /// A C++20 module import declaration imports the named module or partition.
4880 /// Periods are permitted in C++20 module names, but have no semantic meaning.
4881 /// For example:
4882 /// \code
4883 ///   import NamedModule;
4884 ///   import :SomePartition; // Must be a partition of the current module.
4885 ///   import Names.Like.this; // Allowed.
4886 ///   import :and.Also.Partition.names;
4887 /// \endcode
4888 ///
4889 /// Import declarations can also be implicitly generated from
4890 /// \#include/\#import directives.
4891 class ImportDecl final : public Decl,
4892                          llvm::TrailingObjects<ImportDecl, SourceLocation> {
4893   friend class ASTContext;
4894   friend class ASTDeclReader;
4895   friend class ASTReader;
4896   friend TrailingObjects;
4897 
4898   /// The imported module.
4899   Module *ImportedModule = nullptr;
4900 
4901   /// The next import in the list of imports local to the translation
4902   /// unit being parsed (not loaded from an AST file).
4903   ///
4904   /// Includes a bit that indicates whether we have source-location information
4905   /// for each identifier in the module name.
4906   ///
4907   /// When the bit is false, we only have a single source location for the
4908   /// end of the import declaration.
4909   llvm::PointerIntPair<ImportDecl *, 1, bool> NextLocalImportAndComplete;
4910 
4911   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
4912              ArrayRef<SourceLocation> IdentifierLocs);
4913 
4914   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
4915              SourceLocation EndLoc);
4916 
4917   ImportDecl(EmptyShell Empty) : Decl(Import, Empty) {}
4918 
4919   bool isImportComplete() const { return NextLocalImportAndComplete.getInt(); }
4920 
4921   void setImportComplete(bool C) { NextLocalImportAndComplete.setInt(C); }
4922 
4923   /// The next import in the list of imports local to the translation
4924   /// unit being parsed (not loaded from an AST file).
4925   ImportDecl *getNextLocalImport() const {
4926     return NextLocalImportAndComplete.getPointer();
4927   }
4928 
4929   void setNextLocalImport(ImportDecl *Import) {
4930     NextLocalImportAndComplete.setPointer(Import);
4931   }
4932 
4933 public:
4934   /// Create a new module import declaration.
4935   static ImportDecl *Create(ASTContext &C, DeclContext *DC,
4936                             SourceLocation StartLoc, Module *Imported,
4937                             ArrayRef<SourceLocation> IdentifierLocs);
4938 
4939   /// Create a new module import declaration for an implicitly-generated
4940   /// import.
4941   static ImportDecl *CreateImplicit(ASTContext &C, DeclContext *DC,
4942                                     SourceLocation StartLoc, Module *Imported,
4943                                     SourceLocation EndLoc);
4944 
4945   /// Create a new, deserialized module import declaration.
4946   static ImportDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
4947                                         unsigned NumLocations);
4948 
4949   /// Retrieve the module that was imported by the import declaration.
4950   Module *getImportedModule() const { return ImportedModule; }
4951 
4952   /// Retrieves the locations of each of the identifiers that make up
4953   /// the complete module name in the import declaration.
4954   ///
4955   /// This will return an empty array if the locations of the individual
4956   /// identifiers aren't available.
4957   ArrayRef<SourceLocation> getIdentifierLocs() const;
4958 
4959   SourceRange getSourceRange() const override LLVM_READONLY;
4960 
4961   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
4962   static bool classofKind(Kind K) { return K == Import; }
4963 };
4964 
4965 /// Represents a standard C++ module export declaration.
4966 ///
4967 /// For example:
4968 /// \code
4969 ///   export void foo();
4970 /// \endcode
4971 class ExportDecl final : public Decl, public DeclContext {
4972   virtual void anchor();
4973 
4974 private:
4975   friend class ASTDeclReader;
4976 
4977   /// The source location for the right brace (if valid).
4978   SourceLocation RBraceLoc;
4979 
4980   ExportDecl(DeclContext *DC, SourceLocation ExportLoc)
4981       : Decl(Export, DC, ExportLoc), DeclContext(Export),
4982         RBraceLoc(SourceLocation()) {}
4983 
4984 public:
4985   static ExportDecl *Create(ASTContext &C, DeclContext *DC,
4986                             SourceLocation ExportLoc);
4987   static ExportDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
4988 
4989   SourceLocation getExportLoc() const { return getLocation(); }
4990   SourceLocation getRBraceLoc() const { return RBraceLoc; }
4991   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
4992 
4993   bool hasBraces() const { return RBraceLoc.isValid(); }
4994 
4995   SourceLocation getEndLoc() const LLVM_READONLY {
4996     if (hasBraces())
4997       return RBraceLoc;
4998     // No braces: get the end location of the (only) declaration in context
4999     // (if present).
5000     return decls_empty() ? getLocation() : decls_begin()->getEndLoc();
5001   }
5002 
5003   SourceRange getSourceRange() const override LLVM_READONLY {
5004     return SourceRange(getLocation(), getEndLoc());
5005   }
5006 
5007   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
5008   static bool classofKind(Kind K) { return K == Export; }
5009   static DeclContext *castToDeclContext(const ExportDecl *D) {
5010     return static_cast<DeclContext *>(const_cast<ExportDecl*>(D));
5011   }
5012   static ExportDecl *castFromDeclContext(const DeclContext *DC) {
5013     return static_cast<ExportDecl *>(const_cast<DeclContext*>(DC));
5014   }
5015 };
5016 
5017 /// Represents an empty-declaration.
5018 class EmptyDecl : public Decl {
5019   EmptyDecl(DeclContext *DC, SourceLocation L) : Decl(Empty, DC, L) {}
5020 
5021   virtual void anchor();
5022 
5023 public:
5024   static EmptyDecl *Create(ASTContext &C, DeclContext *DC,
5025                            SourceLocation L);
5026   static EmptyDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
5027 
5028   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
5029   static bool classofKind(Kind K) { return K == Empty; }
5030 };
5031 
5032 /// HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
5033 class HLSLBufferDecl final : public NamedDecl, public DeclContext {
5034   /// LBraceLoc - The ending location of the source range.
5035   SourceLocation LBraceLoc;
5036   /// RBraceLoc - The ending location of the source range.
5037   SourceLocation RBraceLoc;
5038   /// KwLoc - The location of the cbuffer or tbuffer keyword.
5039   SourceLocation KwLoc;
5040   /// IsCBuffer - Whether the buffer is a cbuffer (and not a tbuffer).
5041   bool IsCBuffer;
5042 
5043   HLSLBufferDecl(DeclContext *DC, bool CBuffer, SourceLocation KwLoc,
5044                  IdentifierInfo *ID, SourceLocation IDLoc,
5045                  SourceLocation LBrace);
5046 
5047 public:
5048   static HLSLBufferDecl *Create(ASTContext &C, DeclContext *LexicalParent,
5049                                 bool CBuffer, SourceLocation KwLoc,
5050                                 IdentifierInfo *ID, SourceLocation IDLoc,
5051                                 SourceLocation LBrace);
5052   static HLSLBufferDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
5053 
5054   SourceRange getSourceRange() const override LLVM_READONLY {
5055     return SourceRange(getLocStart(), RBraceLoc);
5056   }
5057   SourceLocation getLocStart() const LLVM_READONLY { return KwLoc; }
5058   SourceLocation getLBraceLoc() const { return LBraceLoc; }
5059   SourceLocation getRBraceLoc() const { return RBraceLoc; }
5060   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
5061   bool isCBuffer() const { return IsCBuffer; }
5062 
5063   // Implement isa/cast/dyncast/etc.
5064   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
5065   static bool classofKind(Kind K) { return K == HLSLBuffer; }
5066   static DeclContext *castToDeclContext(const HLSLBufferDecl *D) {
5067     return static_cast<DeclContext *>(const_cast<HLSLBufferDecl *>(D));
5068   }
5069   static HLSLBufferDecl *castFromDeclContext(const DeclContext *DC) {
5070     return static_cast<HLSLBufferDecl *>(const_cast<DeclContext *>(DC));
5071   }
5072 
5073   friend class ASTDeclReader;
5074   friend class ASTDeclWriter;
5075 };
5076 
5077 /// Insertion operator for diagnostics.  This allows sending NamedDecl's
5078 /// into a diagnostic with <<.
5079 inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
5080                                              const NamedDecl *ND) {
5081   PD.AddTaggedVal(reinterpret_cast<uint64_t>(ND),
5082                   DiagnosticsEngine::ak_nameddecl);
5083   return PD;
5084 }
5085 
5086 template<typename decl_type>
5087 void Redeclarable<decl_type>::setPreviousDecl(decl_type *PrevDecl) {
5088   // Note: This routine is implemented here because we need both NamedDecl
5089   // and Redeclarable to be defined.
5090   assert(RedeclLink.isFirst() &&
5091          "setPreviousDecl on a decl already in a redeclaration chain");
5092 
5093   if (PrevDecl) {
5094     // Point to previous. Make sure that this is actually the most recent
5095     // redeclaration, or we can build invalid chains. If the most recent
5096     // redeclaration is invalid, it won't be PrevDecl, but we want it anyway.
5097     First = PrevDecl->getFirstDecl();
5098     assert(First->RedeclLink.isFirst() && "Expected first");
5099     decl_type *MostRecent = First->getNextRedeclaration();
5100     RedeclLink = PreviousDeclLink(cast<decl_type>(MostRecent));
5101 
5102     // If the declaration was previously visible, a redeclaration of it remains
5103     // visible even if it wouldn't be visible by itself.
5104     static_cast<decl_type*>(this)->IdentifierNamespace |=
5105       MostRecent->getIdentifierNamespace() &
5106       (Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Type);
5107   } else {
5108     // Make this first.
5109     First = static_cast<decl_type*>(this);
5110   }
5111 
5112   // First one will point to this one as latest.
5113   First->RedeclLink.setLatest(static_cast<decl_type*>(this));
5114 
5115   assert(!isa<NamedDecl>(static_cast<decl_type*>(this)) ||
5116          cast<NamedDecl>(static_cast<decl_type*>(this))->isLinkageValid());
5117 }
5118 
5119 // Inline function definitions.
5120 
5121 /// Check if the given decl is complete.
5122 ///
5123 /// We use this function to break a cycle between the inline definitions in
5124 /// Type.h and Decl.h.
5125 inline bool IsEnumDeclComplete(EnumDecl *ED) {
5126   return ED->isComplete();
5127 }
5128 
5129 /// Check if the given decl is scoped.
5130 ///
5131 /// We use this function to break a cycle between the inline definitions in
5132 /// Type.h and Decl.h.
5133 inline bool IsEnumDeclScoped(EnumDecl *ED) {
5134   return ED->isScoped();
5135 }
5136 
5137 /// OpenMP variants are mangled early based on their OpenMP context selector.
5138 /// The new name looks likes this:
5139 ///  <name> + OpenMPVariantManglingSeparatorStr + <mangled OpenMP context>
5140 static constexpr StringRef getOpenMPVariantManglingSeparatorStr() {
5141   return "$ompvariant";
5142 }
5143 
5144 /// Returns whether the given FunctionDecl has an __arm[_locally]_streaming
5145 /// attribute.
5146 bool IsArmStreamingFunction(const FunctionDecl *FD,
5147                             bool IncludeLocallyStreaming);
5148 
5149 /// Returns whether the given FunctionDecl has Arm ZA state.
5150 bool hasArmZAState(const FunctionDecl *FD);
5151 
5152 /// Returns whether the given FunctionDecl has Arm ZT0 state.
5153 bool hasArmZT0State(const FunctionDecl *FD);
5154 
5155 } // namespace clang
5156 
5157 #endif // LLVM_CLANG_AST_DECL_H