Home | History | Annotate | Download | only in AST
      1 //===--- Decl.h - Classes for representing declarations ---------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the Decl subclasses.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_AST_DECL_H
     15 #define LLVM_CLANG_AST_DECL_H
     16 
     17 #include "clang/AST/APValue.h"
     18 #include "clang/AST/DeclBase.h"
     19 #include "clang/AST/Redeclarable.h"
     20 #include "clang/AST/DeclarationName.h"
     21 #include "clang/AST/ExternalASTSource.h"
     22 #include "clang/Basic/Linkage.h"
     23 #include "llvm/ADT/Optional.h"
     24 
     25 namespace clang {
     26 class CXXTemporary;
     27 class Expr;
     28 class FunctionTemplateDecl;
     29 class Stmt;
     30 class CompoundStmt;
     31 class StringLiteral;
     32 class NestedNameSpecifier;
     33 class TemplateParameterList;
     34 class TemplateArgumentList;
     35 class MemberSpecializationInfo;
     36 class FunctionTemplateSpecializationInfo;
     37 class DependentFunctionTemplateSpecializationInfo;
     38 class TypeLoc;
     39 class UnresolvedSetImpl;
     40 class LabelStmt;
     41 
     42 /// \brief A container of type source information.
     43 ///
     44 /// A client can read the relevant info using TypeLoc wrappers, e.g:
     45 /// @code
     46 /// TypeLoc TL = TypeSourceInfo->getTypeLoc();
     47 /// if (PointerLoc *PL = dyn_cast<PointerLoc>(&TL))
     48 ///   PL->getStarLoc().print(OS, SrcMgr);
     49 /// @endcode
     50 ///
     51 class TypeSourceInfo {
     52   QualType Ty;
     53   // Contains a memory block after the class, used for type source information,
     54   // allocated by ASTContext.
     55   friend class ASTContext;
     56   TypeSourceInfo(QualType ty) : Ty(ty) { }
     57 public:
     58   /// \brief Return the type wrapped by this type source info.
     59   QualType getType() const { return Ty; }
     60 
     61   /// \brief Return the TypeLoc wrapper for the type source info.
     62   TypeLoc getTypeLoc() const; // implemented in TypeLoc.h
     63 };
     64 
     65 /// TranslationUnitDecl - The top declaration context.
     66 class TranslationUnitDecl : public Decl, public DeclContext {
     67   ASTContext &Ctx;
     68 
     69   /// The (most recently entered) anonymous namespace for this
     70   /// translation unit, if one has been created.
     71   NamespaceDecl *AnonymousNamespace;
     72 
     73   explicit TranslationUnitDecl(ASTContext &ctx)
     74     : Decl(TranslationUnit, 0, SourceLocation()),
     75       DeclContext(TranslationUnit),
     76       Ctx(ctx), AnonymousNamespace(0) {}
     77 public:
     78   ASTContext &getASTContext() const { return Ctx; }
     79 
     80   NamespaceDecl *getAnonymousNamespace() const { return AnonymousNamespace; }
     81   void setAnonymousNamespace(NamespaceDecl *D) { AnonymousNamespace = D; }
     82 
     83   static TranslationUnitDecl *Create(ASTContext &C);
     84   // Implement isa/cast/dyncast/etc.
     85   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
     86   static bool classof(const TranslationUnitDecl *D) { return true; }
     87   static bool classofKind(Kind K) { return K == TranslationUnit; }
     88   static DeclContext *castToDeclContext(const TranslationUnitDecl *D) {
     89     return static_cast<DeclContext *>(const_cast<TranslationUnitDecl*>(D));
     90   }
     91   static TranslationUnitDecl *castFromDeclContext(const DeclContext *DC) {
     92     return static_cast<TranslationUnitDecl *>(const_cast<DeclContext*>(DC));
     93   }
     94 };
     95 
     96 /// NamedDecl - This represents a decl with a name.  Many decls have names such
     97 /// as ObjCMethodDecl, but not @class, etc.
     98 class NamedDecl : public Decl {
     99   /// Name - The name of this declaration, which is typically a normal
    100   /// identifier but may also be a special kind of name (C++
    101   /// constructor, Objective-C selector, etc.)
    102   DeclarationName Name;
    103 
    104 protected:
    105   NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
    106     : Decl(DK, DC, L), Name(N) { }
    107 
    108 public:
    109   /// getIdentifier - Get the identifier that names this declaration,
    110   /// if there is one. This will return NULL if this declaration has
    111   /// no name (e.g., for an unnamed class) or if the name is a special
    112   /// name (C++ constructor, Objective-C selector, etc.).
    113   IdentifierInfo *getIdentifier() const { return Name.getAsIdentifierInfo(); }
    114 
    115   /// getName - Get the name of identifier for this declaration as a StringRef.
    116   /// This requires that the declaration have a name and that it be a simple
    117   /// identifier.
    118   llvm::StringRef getName() const {
    119     assert(Name.isIdentifier() && "Name is not a simple identifier");
    120     return getIdentifier() ? getIdentifier()->getName() : "";
    121   }
    122 
    123   /// getNameAsString - Get a human-readable name for the declaration, even if
    124   /// it is one of the special kinds of names (C++ constructor, Objective-C
    125   /// selector, etc).  Creating this name requires expensive string
    126   /// manipulation, so it should be called only when performance doesn't matter.
    127   /// For simple declarations, getNameAsCString() should suffice.
    128   //
    129   // FIXME: This function should be renamed to indicate that it is not just an
    130   // alternate form of getName(), and clients should move as appropriate.
    131   //
    132   // FIXME: Deprecated, move clients to getName().
    133   std::string getNameAsString() const { return Name.getAsString(); }
    134 
    135   void printName(llvm::raw_ostream &os) const { return Name.printName(os); }
    136 
    137   /// getDeclName - Get the actual, stored name of the declaration,
    138   /// which may be a special name.
    139   DeclarationName getDeclName() const { return Name; }
    140 
    141   /// \brief Set the name of this declaration.
    142   void setDeclName(DeclarationName N) { Name = N; }
    143 
    144   /// getQualifiedNameAsString - Returns human-readable qualified name for
    145   /// declaration, like A::B::i, for i being member of namespace A::B.
    146   /// If declaration is not member of context which can be named (record,
    147   /// namespace), it will return same result as getNameAsString().
    148   /// Creating this name is expensive, so it should be called only when
    149   /// performance doesn't matter.
    150   std::string getQualifiedNameAsString() const;
    151   std::string getQualifiedNameAsString(const PrintingPolicy &Policy) const;
    152 
    153   /// getNameForDiagnostic - Appends a human-readable name for this
    154   /// declaration into the given string.
    155   ///
    156   /// This is the method invoked by Sema when displaying a NamedDecl
    157   /// in a diagnostic.  It does not necessarily produce the same
    158   /// result as getNameAsString(); for example, class template
    159   /// specializations are printed with their template arguments.
    160   ///
    161   /// TODO: use an API that doesn't require so many temporary strings
    162   virtual void getNameForDiagnostic(std::string &S,
    163                                     const PrintingPolicy &Policy,
    164                                     bool Qualified) const {
    165     if (Qualified)
    166       S += getQualifiedNameAsString(Policy);
    167     else
    168       S += getNameAsString();
    169   }
    170 
    171   /// declarationReplaces - Determine whether this declaration, if
    172   /// known to be well-formed within its context, will replace the
    173   /// declaration OldD if introduced into scope. A declaration will
    174   /// replace another declaration if, for example, it is a
    175   /// redeclaration of the same variable or function, but not if it is
    176   /// a declaration of a different kind (function vs. class) or an
    177   /// overloaded function.
    178   bool declarationReplaces(NamedDecl *OldD) const;
    179 
    180   /// \brief Determine whether this declaration has linkage.
    181   bool hasLinkage() const;
    182 
    183   /// \brief Determine whether this declaration is a C++ class member.
    184   bool isCXXClassMember() const {
    185     const DeclContext *DC = getDeclContext();
    186 
    187     // C++0x [class.mem]p1:
    188     //   The enumerators of an unscoped enumeration defined in
    189     //   the class are members of the class.
    190     // FIXME: support C++0x scoped enumerations.
    191     if (isa<EnumDecl>(DC))
    192       DC = DC->getParent();
    193 
    194     return DC->isRecord();
    195   }
    196 
    197   /// \brief Given that this declaration is a C++ class member,
    198   /// determine whether it's an instance member of its class.
    199   bool isCXXInstanceMember() const;
    200 
    201   class LinkageInfo {
    202     Linkage linkage_;
    203     Visibility visibility_;
    204     bool explicit_;
    205 
    206   public:
    207     LinkageInfo() : linkage_(ExternalLinkage), visibility_(DefaultVisibility),
    208                     explicit_(false) {}
    209     LinkageInfo(Linkage L, Visibility V, bool E)
    210       : linkage_(L), visibility_(V), explicit_(E) {}
    211 
    212     static LinkageInfo external() {
    213       return LinkageInfo();
    214     }
    215     static LinkageInfo internal() {
    216       return LinkageInfo(InternalLinkage, DefaultVisibility, false);
    217     }
    218     static LinkageInfo uniqueExternal() {
    219       return LinkageInfo(UniqueExternalLinkage, DefaultVisibility, false);
    220     }
    221     static LinkageInfo none() {
    222       return LinkageInfo(NoLinkage, DefaultVisibility, false);
    223     }
    224 
    225     Linkage linkage() const { return linkage_; }
    226     Visibility visibility() const { return visibility_; }
    227     bool visibilityExplicit() const { return explicit_; }
    228 
    229     void setLinkage(Linkage L) { linkage_ = L; }
    230     void setVisibility(Visibility V) { visibility_ = V; }
    231     void setVisibility(Visibility V, bool E) { visibility_ = V; explicit_ = E; }
    232     void setVisibility(LinkageInfo Other) {
    233       setVisibility(Other.visibility(), Other.visibilityExplicit());
    234     }
    235 
    236     void mergeLinkage(Linkage L) {
    237       setLinkage(minLinkage(linkage(), L));
    238     }
    239     void mergeLinkage(LinkageInfo Other) {
    240       setLinkage(minLinkage(linkage(), Other.linkage()));
    241     }
    242 
    243     void mergeVisibility(Visibility V) {
    244       setVisibility(minVisibility(visibility(), V));
    245     }
    246     void mergeVisibility(Visibility V, bool E) {
    247       setVisibility(minVisibility(visibility(), V), visibilityExplicit() || E);
    248     }
    249     void mergeVisibility(LinkageInfo Other) {
    250       mergeVisibility(Other.visibility(), Other.visibilityExplicit());
    251     }
    252 
    253     void merge(LinkageInfo Other) {
    254       mergeLinkage(Other);
    255       mergeVisibility(Other);
    256     }
    257     void merge(std::pair<Linkage,Visibility> LV) {
    258       mergeLinkage(LV.first);
    259       mergeVisibility(LV.second);
    260     }
    261 
    262     friend LinkageInfo merge(LinkageInfo L, LinkageInfo R) {
    263       L.merge(R);
    264       return L;
    265     }
    266   };
    267 
    268   /// \brief Determine what kind of linkage this entity has.
    269   Linkage getLinkage() const;
    270 
    271   /// \brief Determines the visibility of this entity.
    272   Visibility getVisibility() const { return getLinkageAndVisibility().visibility(); }
    273 
    274   /// \brief Determines the linkage and visibility of this entity.
    275   LinkageInfo getLinkageAndVisibility() const;
    276 
    277   /// \brief If visibility was explicitly specified for this
    278   /// declaration, return that visibility.
    279   llvm::Optional<Visibility> getExplicitVisibility() const;
    280 
    281   /// \brief Clear the linkage cache in response to a change
    282   /// to the declaration.
    283   void ClearLinkageCache();
    284 
    285   /// \brief Looks through UsingDecls and ObjCCompatibleAliasDecls for
    286   /// the underlying named decl.
    287   NamedDecl *getUnderlyingDecl();
    288   const NamedDecl *getUnderlyingDecl() const {
    289     return const_cast<NamedDecl*>(this)->getUnderlyingDecl();
    290   }
    291 
    292   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    293   static bool classof(const NamedDecl *D) { return true; }
    294   static bool classofKind(Kind K) { return K >= firstNamed && K <= lastNamed; }
    295 };
    296 
    297 inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
    298                                      const NamedDecl *ND) {
    299   ND->getDeclName().printName(OS);
    300   return OS;
    301 }
    302 
    303 /// LabelDecl - Represents the declaration of a label.  Labels also have a
    304 /// corresponding LabelStmt, which indicates the position that the label was
    305 /// defined at.  For normal labels, the location of the decl is the same as the
    306 /// location of the statement.  For GNU local labels (__label__), the decl
    307 /// location is where the __label__ is.
    308 class LabelDecl : public NamedDecl {
    309   LabelStmt *TheStmt;
    310   /// LocStart - For normal labels, this is the same as the main declaration
    311   /// label, i.e., the location of the identifier; for GNU local labels,
    312   /// this is the location of the __label__ keyword.
    313   SourceLocation LocStart;
    314 
    315   LabelDecl(DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II,
    316             LabelStmt *S, SourceLocation StartL)
    317     : NamedDecl(Label, DC, IdentL, II), TheStmt(S), LocStart(StartL) {}
    318 
    319 public:
    320   static LabelDecl *Create(ASTContext &C, DeclContext *DC,
    321                            SourceLocation IdentL, IdentifierInfo *II);
    322   static LabelDecl *Create(ASTContext &C, DeclContext *DC,
    323                            SourceLocation IdentL, IdentifierInfo *II,
    324                            SourceLocation GnuLabelL);
    325 
    326   LabelStmt *getStmt() const { return TheStmt; }
    327   void setStmt(LabelStmt *T) { TheStmt = T; }
    328 
    329   bool isGnuLocal() const { return LocStart != getLocation(); }
    330   void setLocStart(SourceLocation L) { LocStart = L; }
    331 
    332   SourceRange getSourceRange() const {
    333     return SourceRange(LocStart, getLocation());
    334   }
    335 
    336   // Implement isa/cast/dyncast/etc.
    337   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    338   static bool classof(const LabelDecl *D) { return true; }
    339   static bool classofKind(Kind K) { return K == Label; }
    340 };
    341 
    342 /// NamespaceDecl - Represent a C++ namespace.
    343 class NamespaceDecl : public NamedDecl, public DeclContext {
    344   bool IsInline : 1;
    345 
    346   /// LocStart - The starting location of the source range, pointing
    347   /// to either the namespace or the inline keyword.
    348   SourceLocation LocStart;
    349   /// RBraceLoc - The ending location of the source range.
    350   SourceLocation RBraceLoc;
    351 
    352   // For extended namespace definitions:
    353   //
    354   // namespace A { int x; }
    355   // namespace A { int y; }
    356   //
    357   // there will be one NamespaceDecl for each declaration.
    358   // NextNamespace points to the next extended declaration.
    359   // OrigNamespace points to the original namespace declaration.
    360   // OrigNamespace of the first namespace decl points to its anonymous namespace
    361   LazyDeclPtr NextNamespace;
    362 
    363   /// \brief A pointer to either the original namespace definition for
    364   /// this namespace (if the boolean value is false) or the anonymous
    365   /// namespace that lives just inside this namespace (if the boolean
    366   /// value is true).
    367   ///
    368   /// We can combine these two notions because the anonymous namespace
    369   /// must only be stored in one of the namespace declarations (so all
    370   /// of the namespace declarations can find it). We therefore choose
    371   /// the original namespace declaration, since all of the namespace
    372   /// declarations have a link directly to it; the original namespace
    373   /// declaration itself only needs to know that it is the original
    374   /// namespace declaration (which the boolean indicates).
    375   llvm::PointerIntPair<NamespaceDecl *, 1, bool> OrigOrAnonNamespace;
    376 
    377   NamespaceDecl(DeclContext *DC, SourceLocation StartLoc,
    378                 SourceLocation IdLoc, IdentifierInfo *Id)
    379     : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
    380       IsInline(false), LocStart(StartLoc), RBraceLoc(),
    381       NextNamespace(), OrigOrAnonNamespace(0, true) { }
    382 
    383 public:
    384   static NamespaceDecl *Create(ASTContext &C, DeclContext *DC,
    385                                SourceLocation StartLoc,
    386                                SourceLocation IdLoc, IdentifierInfo *Id);
    387 
    388   /// \brief Returns true if this is an anonymous namespace declaration.
    389   ///
    390   /// For example:
    391   /// \code
    392   ///   namespace {
    393   ///     ...
    394   ///   };
    395   /// \endcode
    396   /// q.v. C++ [namespace.unnamed]
    397   bool isAnonymousNamespace() const {
    398     return !getIdentifier();
    399   }
    400 
    401   /// \brief Returns true if this is an inline namespace declaration.
    402   bool isInline() const {
    403     return IsInline;
    404   }
    405 
    406   /// \brief Set whether this is an inline namespace declaration.
    407   void setInline(bool Inline) {
    408     IsInline = Inline;
    409   }
    410 
    411   /// \brief Return the next extended namespace declaration or null if there
    412   /// is none.
    413   NamespaceDecl *getNextNamespace();
    414   const NamespaceDecl *getNextNamespace() const {
    415     return const_cast<NamespaceDecl *>(this)->getNextNamespace();
    416   }
    417 
    418   /// \brief Set the next extended namespace declaration.
    419   void setNextNamespace(NamespaceDecl *ND) { NextNamespace = ND; }
    420 
    421   /// \brief Get the original (first) namespace declaration.
    422   NamespaceDecl *getOriginalNamespace() const {
    423     if (OrigOrAnonNamespace.getInt())
    424       return const_cast<NamespaceDecl *>(this);
    425 
    426     return OrigOrAnonNamespace.getPointer();
    427   }
    428 
    429   /// \brief Return true if this declaration is an original (first) declaration
    430   /// of the namespace. This is false for non-original (subsequent) namespace
    431   /// declarations and anonymous namespaces.
    432   bool isOriginalNamespace() const {
    433     return getOriginalNamespace() == this;
    434   }
    435 
    436   /// \brief Set the original (first) namespace declaration.
    437   void setOriginalNamespace(NamespaceDecl *ND) {
    438     if (ND != this) {
    439       OrigOrAnonNamespace.setPointer(ND);
    440       OrigOrAnonNamespace.setInt(false);
    441     }
    442   }
    443 
    444   NamespaceDecl *getAnonymousNamespace() const {
    445     return getOriginalNamespace()->OrigOrAnonNamespace.getPointer();
    446   }
    447 
    448   void setAnonymousNamespace(NamespaceDecl *D) {
    449     assert(!D || D->isAnonymousNamespace());
    450     assert(!D || D->getParent()->getRedeclContext() == this);
    451     getOriginalNamespace()->OrigOrAnonNamespace.setPointer(D);
    452   }
    453 
    454   virtual NamespaceDecl *getCanonicalDecl() { return getOriginalNamespace(); }
    455   const NamespaceDecl *getCanonicalDecl() const {
    456     return getOriginalNamespace();
    457   }
    458 
    459   virtual SourceRange getSourceRange() const {
    460     return SourceRange(LocStart, RBraceLoc);
    461   }
    462 
    463   SourceLocation getLocStart() const { return LocStart; }
    464   SourceLocation getRBraceLoc() const { return RBraceLoc; }
    465   void setLocStart(SourceLocation L) { LocStart = L; }
    466   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
    467 
    468   // Implement isa/cast/dyncast/etc.
    469   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    470   static bool classof(const NamespaceDecl *D) { return true; }
    471   static bool classofKind(Kind K) { return K == Namespace; }
    472   static DeclContext *castToDeclContext(const NamespaceDecl *D) {
    473     return static_cast<DeclContext *>(const_cast<NamespaceDecl*>(D));
    474   }
    475   static NamespaceDecl *castFromDeclContext(const DeclContext *DC) {
    476     return static_cast<NamespaceDecl *>(const_cast<DeclContext*>(DC));
    477   }
    478 
    479   friend class ASTDeclReader;
    480   friend class ASTDeclWriter;
    481 };
    482 
    483 /// ValueDecl - Represent the declaration of a variable (in which case it is
    484 /// an lvalue) a function (in which case it is a function designator) or
    485 /// an enum constant.
    486 class ValueDecl : public NamedDecl {
    487   QualType DeclType;
    488 
    489 protected:
    490   ValueDecl(Kind DK, DeclContext *DC, SourceLocation L,
    491             DeclarationName N, QualType T)
    492     : NamedDecl(DK, DC, L, N), DeclType(T) {}
    493 public:
    494   QualType getType() const { return DeclType; }
    495   void setType(QualType newType) { DeclType = newType; }
    496 
    497   // Implement isa/cast/dyncast/etc.
    498   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    499   static bool classof(const ValueDecl *D) { return true; }
    500   static bool classofKind(Kind K) { return K >= firstValue && K <= lastValue; }
    501 };
    502 
    503 /// QualifierInfo - A struct with extended info about a syntactic
    504 /// name qualifier, to be used for the case of out-of-line declarations.
    505 struct QualifierInfo {
    506   NestedNameSpecifierLoc QualifierLoc;
    507 
    508   /// NumTemplParamLists - The number of "outer" template parameter lists.
    509   /// The count includes all of the template parameter lists that were matched
    510   /// against the template-ids occurring into the NNS and possibly (in the
    511   /// case of an explicit specialization) a final "template <>".
    512   unsigned NumTemplParamLists;
    513 
    514   /// TemplParamLists - A new-allocated array of size NumTemplParamLists,
    515   /// containing pointers to the "outer" template parameter lists.
    516   /// It includes all of the template parameter lists that were matched
    517   /// against the template-ids occurring into the NNS and possibly (in the
    518   /// case of an explicit specialization) a final "template <>".
    519   TemplateParameterList** TemplParamLists;
    520 
    521   /// Default constructor.
    522   QualifierInfo() : QualifierLoc(), NumTemplParamLists(0), TemplParamLists(0) {}
    523 
    524   /// setTemplateParameterListsInfo - Sets info about "outer" template
    525   /// parameter lists.
    526   void setTemplateParameterListsInfo(ASTContext &Context,
    527                                      unsigned NumTPLists,
    528                                      TemplateParameterList **TPLists);
    529 
    530 private:
    531   // Copy constructor and copy assignment are disabled.
    532   QualifierInfo(const QualifierInfo&);
    533   QualifierInfo& operator=(const QualifierInfo&);
    534 };
    535 
    536 /// \brief Represents a ValueDecl that came out of a declarator.
    537 /// Contains type source information through TypeSourceInfo.
    538 class DeclaratorDecl : public ValueDecl {
    539   // A struct representing both a TInfo and a syntactic qualifier,
    540   // to be used for the (uncommon) case of out-of-line declarations.
    541   struct ExtInfo : public QualifierInfo {
    542     TypeSourceInfo *TInfo;
    543   };
    544 
    545   llvm::PointerUnion<TypeSourceInfo*, ExtInfo*> DeclInfo;
    546 
    547   /// InnerLocStart - The start of the source range for this declaration,
    548   /// ignoring outer template declarations.
    549   SourceLocation InnerLocStart;
    550 
    551   bool hasExtInfo() const { return DeclInfo.is<ExtInfo*>(); }
    552   ExtInfo *getExtInfo() { return DeclInfo.get<ExtInfo*>(); }
    553   const ExtInfo *getExtInfo() const { return DeclInfo.get<ExtInfo*>(); }
    554 
    555 protected:
    556   DeclaratorDecl(Kind DK, DeclContext *DC, SourceLocation L,
    557                  DeclarationName N, QualType T, TypeSourceInfo *TInfo,
    558                  SourceLocation StartL)
    559     : ValueDecl(DK, DC, L, N, T), DeclInfo(TInfo), InnerLocStart(StartL) {
    560   }
    561 
    562 public:
    563   TypeSourceInfo *getTypeSourceInfo() const {
    564     return hasExtInfo()
    565       ? getExtInfo()->TInfo
    566       : DeclInfo.get<TypeSourceInfo*>();
    567   }
    568   void setTypeSourceInfo(TypeSourceInfo *TI) {
    569     if (hasExtInfo())
    570       getExtInfo()->TInfo = TI;
    571     else
    572       DeclInfo = TI;
    573   }
    574 
    575   /// getInnerLocStart - Return SourceLocation representing start of source
    576   /// range ignoring outer template declarations.
    577   SourceLocation getInnerLocStart() const { return InnerLocStart; }
    578   void setInnerLocStart(SourceLocation L) { InnerLocStart = L; }
    579 
    580   /// getOuterLocStart - Return SourceLocation representing start of source
    581   /// range taking into account any outer template declarations.
    582   SourceLocation getOuterLocStart() const;
    583 
    584   virtual SourceRange getSourceRange() const;
    585 
    586   /// \brief Retrieve the nested-name-specifier that qualifies the name of this
    587   /// declaration, if it was present in the source.
    588   NestedNameSpecifier *getQualifier() const {
    589     return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
    590                         : 0;
    591   }
    592 
    593   /// \brief Retrieve the nested-name-specifier (with source-location
    594   /// information) that qualifies the name of this declaration, if it was
    595   /// present in the source.
    596   NestedNameSpecifierLoc getQualifierLoc() const {
    597     return hasExtInfo() ? getExtInfo()->QualifierLoc
    598                         : NestedNameSpecifierLoc();
    599   }
    600 
    601   void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc);
    602 
    603   unsigned getNumTemplateParameterLists() const {
    604     return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
    605   }
    606   TemplateParameterList *getTemplateParameterList(unsigned index) const {
    607     assert(index < getNumTemplateParameterLists());
    608     return getExtInfo()->TemplParamLists[index];
    609   }
    610   void setTemplateParameterListsInfo(ASTContext &Context, unsigned NumTPLists,
    611                                      TemplateParameterList **TPLists);
    612 
    613   SourceLocation getTypeSpecStartLoc() const;
    614 
    615   // Implement isa/cast/dyncast/etc.
    616   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
    617   static bool classof(const DeclaratorDecl *D) { return true; }
    618   static bool classofKind(Kind K) {
    619     return K >= firstDeclarator && K <= lastDeclarator;
    620   }
    621 
    622   friend class ASTDeclReader;
    623   friend class ASTDeclWriter;
    624 };
    625 
    626 /// \brief Structure used to store a statement, the constant value to
    627 /// which it was evaluated (if any), and whether or not the statement
    628 /// is an integral constant expression (if known).
    629 struct EvaluatedStmt {
    630   EvaluatedStmt() : WasEvaluated(false), IsEvaluating(false), CheckedICE(false),
    631                     CheckingICE(false), IsICE(false) { }
    632 
    633   /// \brief Whether this statement was already evaluated.
    634   bool WasEvaluated : 1;
    635 
    636   /// \brief Whether this statement is being evaluated.
    637   bool IsEvaluating : 1;
    638 
    639   /// \brief Whether we already checked whether this statement was an
    640   /// integral constant expression.
    641   bool CheckedICE : 1;
    642 
    643   /// \brief Whether we are checking whether this statement is an
    644   /// integral constant expression.
    645   bool CheckingICE : 1;
    646 
    647   /// \brief Whether this statement is an integral constant
    648   /// expression. Only valid if CheckedICE is true.
    649   bool IsICE : 1;
    650 
    651   Stmt *Value;
    652   APValue Evaluated;
    653 };
    654 
    655 /// VarDecl - An instance of this class is created to represent a variable
    656 /// declaration or definition.
    657 class VarDecl : public DeclaratorDecl, public Redeclarable<VarDecl> {
    658 public:
    659   typedef clang::StorageClass StorageClass;
    660 
    661   /// getStorageClassSpecifierString - Return the string used to
    662   /// specify the storage class \arg SC.
    663   ///
    664   /// It is illegal to call this function with SC == None.
    665   static const char *getStorageClassSpecifierString(StorageClass SC);
    666 
    667 protected:
    668   /// \brief Placeholder type used in Init to denote an unparsed C++ default
    669   /// argument.
    670   struct UnparsedDefaultArgument;
    671 
    672   /// \brief Placeholder type used in Init to denote an uninstantiated C++
    673   /// default argument.
    674   struct UninstantiatedDefaultArgument;
    675 
    676   typedef llvm::PointerUnion4<Stmt *, EvaluatedStmt *,
    677                               UnparsedDefaultArgument *,
    678                               UninstantiatedDefaultArgument *> InitType;
    679 
    680   /// \brief The initializer for this variable or, for a ParmVarDecl, the
    681   /// C++ default argument.
    682   mutable InitType Init;
    683 
    684 private:
    685   class VarDeclBitfields {
    686     friend class VarDecl;
    687     friend class ASTDeclReader;
    688 
    689     unsigned SClass : 3;
    690     unsigned SClassAsWritten : 3;
    691     unsigned ThreadSpecified : 1;
    692     unsigned HasCXXDirectInit : 1;
    693 
    694     /// \brief Whether this variable is the exception variable in a C++ catch
    695     /// or an Objective-C @catch statement.
    696     unsigned ExceptionVar : 1;
    697 
    698     /// \brief Whether this local variable could be allocated in the return
    699     /// slot of its function, enabling the named return value optimization (NRVO).
    700     unsigned NRVOVariable : 1;
    701 
    702     /// \brief Whether this variable is the for-range-declaration in a C++0x
    703     /// for-range statement.
    704     unsigned CXXForRangeDecl : 1;
    705 
    706     /// \brief Whether this variable is an ARC pseudo-__strong
    707     /// variable;  see isARCPseudoStrong() for details.
    708     unsigned ARCPseudoStrong : 1;
    709   };
    710   enum { NumVarDeclBits = 13 }; // one reserved bit
    711 
    712   friend class ASTDeclReader;
    713   friend class StmtIteratorBase;
    714 
    715 protected:
    716   class ParmVarDeclBitfields {
    717     friend class ParmVarDecl;
    718     friend class ASTDeclReader;
    719 
    720     unsigned : NumVarDeclBits;
    721 
    722     /// Whether this parameter inherits a default argument from a
    723     /// prior declaration.
    724     unsigned HasInheritedDefaultArg : 1;
    725 
    726     /// Whether this parameter undergoes K&R argument promotion.
    727     unsigned IsKNRPromoted : 1;
    728 
    729     /// Whether this parameter is an ObjC method parameter or not.
    730     unsigned IsObjCMethodParam : 1;
    731 
    732     /// If IsObjCMethodParam, a Decl::ObjCDeclQualifier.
    733     /// Otherwise, the number of function parameter scopes enclosing
    734     /// the function parameter scope in which this parameter was
    735     /// declared.
    736     unsigned ScopeDepthOrObjCQuals : 8;
    737 
    738     /// The number of parameters preceding this parameter in the
    739     /// function parameter scope in which it was declared.
    740     unsigned ParameterIndex : 8;
    741   };
    742 
    743   union {
    744     unsigned AllBits;
    745     VarDeclBitfields VarDeclBits;
    746     ParmVarDeclBitfields ParmVarDeclBits;
    747   };
    748 
    749   VarDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
    750           SourceLocation IdLoc, IdentifierInfo *Id,
    751           QualType T, TypeSourceInfo *TInfo, StorageClass SC,
    752           StorageClass SCAsWritten)
    753     : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc), Init() {
    754     assert(sizeof(VarDeclBitfields) <= sizeof(unsigned));
    755     assert(sizeof(ParmVarDeclBitfields) <= sizeof(unsigned));
    756     AllBits = 0;
    757     VarDeclBits.SClass = SC;
    758     VarDeclBits.SClassAsWritten = SCAsWritten;
    759     // Everything else is implicitly initialized to false.
    760   }
    761 
    762   typedef Redeclarable<VarDecl> redeclarable_base;
    763   virtual VarDecl *getNextRedeclaration() { return RedeclLink.getNext(); }
    764 
    765 public:
    766   typedef redeclarable_base::redecl_iterator redecl_iterator;
    767   redecl_iterator redecls_begin() const {
    768     return redeclarable_base::redecls_begin();
    769   }
    770   redecl_iterator redecls_end() const {
    771     return redeclarable_base::redecls_end();
    772   }
    773 
    774   static VarDecl *Create(ASTContext &C, DeclContext *DC,
    775                          SourceLocation StartLoc, SourceLocation IdLoc,
    776                          IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
    777                          StorageClass S, StorageClass SCAsWritten);
    778 
    779   virtual SourceRange getSourceRange() const;
    780 
    781   StorageClass getStorageClass() const {
    782     return (StorageClass) VarDeclBits.SClass;
    783   }
    784   StorageClass getStorageClassAsWritten() const {
    785     return (StorageClass) VarDeclBits.SClassAsWritten;
    786   }
    787   void setStorageClass(StorageClass SC);
    788   void setStorageClassAsWritten(StorageClass SC) {
    789     assert(isLegalForVariable(SC));
    790     VarDeclBits.SClassAsWritten = SC;
    791   }
    792 
    793   void setThreadSpecified(bool T) { VarDeclBits.ThreadSpecified = T; }
    794   bool isThreadSpecified() const {
    795     return VarDeclBits.ThreadSpecified;
    796   }
    797 
    798   /// hasLocalStorage - Returns true if a variable with function scope
    799   ///  is a non-static local variable.
    800   bool hasLocalStorage() const {
    801     if (getStorageClass() == SC_None)
    802       return !isFileVarDecl();
    803 
    804     // Return true for:  Auto, Register.
    805     // Return false for: Extern, Static, PrivateExtern.
    806 
    807     return getStorageClass() >= SC_Auto;
    808   }
    809 
    810   /// isStaticLocal - Returns true if a variable with function scope is a
    811   /// static local variable.
    812   bool isStaticLocal() const {
    813     return getStorageClass() == SC_Static && !isFileVarDecl();
    814   }
    815 
    816   /// hasExternStorage - Returns true if a variable has extern or
    817   /// __private_extern__ storage.
    818   bool hasExternalStorage() const {
    819     return getStorageClass() == SC_Extern ||
    820            getStorageClass() == SC_PrivateExtern;
    821   }
    822 
    823   /// hasGlobalStorage - Returns true for all variables that do not
    824   ///  have local storage.  This includs all global variables as well
    825   ///  as static variables declared within a function.
    826   bool hasGlobalStorage() const { return !hasLocalStorage(); }
    827 
    828   /// \brief Determines whether this variable is a variable with
    829   /// external, C linkage.
    830   bool isExternC() const;
    831 
    832   /// isLocalVarDecl - Returns true for local variable declarations
    833   /// other than parameters.  Note that this includes static variables
    834   /// inside of functions. It also includes variables inside blocks.
    835   ///
    836   ///   void foo() { int x; static int y; extern int z; }
    837   ///
    838   bool isLocalVarDecl() const {
    839     if (getKind() != Decl::Var)
    840       return false;
    841     if (const DeclContext *DC = getDeclContext())
    842       return DC->getRedeclContext()->isFunctionOrMethod();
    843     return false;
    844   }
    845 
    846   /// isFunctionOrMethodVarDecl - Similar to isLocalVarDecl, but
    847   /// excludes variables declared in blocks.
    848   bool isFunctionOrMethodVarDecl() const {
    849     if (getKind() != Decl::Var)
    850       return false;
    851     const DeclContext *DC = getDeclContext()->getRedeclContext();
    852     return DC->isFunctionOrMethod() && DC->getDeclKind() != Decl::Block;
    853   }
    854 
    855   /// \brief Determines whether this is a static data member.
    856   ///
    857   /// This will only be true in C++, and applies to, e.g., the
    858   /// variable 'x' in:
    859   /// \code
    860   /// struct S {
    861   ///   static int x;
    862   /// };
    863   /// \endcode
    864   bool isStaticDataMember() const {
    865     // If it wasn't static, it would be a FieldDecl.
    866     return getKind() != Decl::ParmVar && getDeclContext()->isRecord();
    867   }
    868 
    869   virtual VarDecl *getCanonicalDecl();
    870   const VarDecl *getCanonicalDecl() const {
    871     return const_cast<VarDecl*>(this)->getCanonicalDecl();
    872   }
    873 
    874   enum DefinitionKind {
    875     DeclarationOnly,      ///< This declaration is only a declaration.
    876     TentativeDefinition,  ///< This declaration is a tentative definition.
    877     Definition            ///< This declaration is definitely a definition.
    878   };
    879 
    880   /// \brief Check whether this declaration is a definition. If this could be
    881   /// a tentative definition (in C), don't check whether there's an overriding
    882   /// definition.
    883   DefinitionKind isThisDeclarationADefinition() const;
    884 
    885   /// \brief Check whether this variable is defined in this
    886   /// translation unit.
    887   DefinitionKind hasDefinition() const;
    888 
    889   /// \brief Get the tentative definition that acts as the real definition in
    890   /// a TU. Returns null if there is a proper definition available.
    891   VarDecl *getActingDefinition();
    892   const VarDecl *getActingDefinition() const {
    893     return const_cast<VarDecl*>(this)->getActingDefinition();
    894   }
    895 
    896   /// \brief Determine whether this is a tentative definition of a
    897   /// variable in C.
    898   bool isTentativeDefinitionNow() const;
    899 
    900   /// \brief Get the real (not just tentative) definition for this declaration.
    901   VarDecl *getDefinition();
    902   const VarDecl *getDefinition() const {
    903     return const_cast<VarDecl*>(this)->getDefinition();
    904   }
    905 
    906   /// \brief Determine whether this is or was instantiated from an out-of-line
    907   /// definition of a static data member.
    908   virtual bool isOutOfLine() const;
    909 
    910   /// \brief If this is a static data member, find its out-of-line definition.
    911   VarDecl *getOutOfLineDefinition();
    912 
    913   /// isFileVarDecl - Returns true for file scoped variable declaration.
    914   bool isFileVarDecl() const {
    915     if (getKind() != Decl::Var)
    916       return false;
    917 
    918     if (getDeclContext()->getRedeclContext()->isFileContext())
    919       return true;
    920 
    921     if (isStaticDataMember())
    922       return true;
    923 
    924     return false;
    925   }
    926 
    927   /// getAnyInitializer - Get the initializer for this variable, no matter which
    928   /// declaration it is attached to.
    929   const Expr *getAnyInitializer() const {
    930     const VarDecl *D;
    931     return getAnyInitializer(D);
    932   }
    933 
    934   /// getAnyInitializer - Get the initializer for this variable, no matter which
    935   /// declaration it is attached to. Also get that declaration.
    936   const Expr *getAnyInitializer(const VarDecl *&D) const;
    937 
    938   bool hasInit() const {
    939     return !Init.isNull() && (Init.is<Stmt *>() || Init.is<EvaluatedStmt *>());
    940   }
    941   const Expr *getInit() const {
    942     if (Init.isNull())
    943       return 0;
    944 
    945     const Stmt *S = Init.dyn_cast<Stmt *>();
    946     if (!S) {
    947       if (EvaluatedStmt *ES = Init.dyn_cast<EvaluatedStmt*>())
    948         S = ES->Value;
    949     }
    950     return (const Expr*) S;
    951   }
    952   Expr *getInit() {
    953     if (Init.isNull())
    954       return 0;
    955 
    956     Stmt *S = Init.dyn_cast<Stmt *>();
    957     if (!S) {
    958       if (EvaluatedStmt *ES = Init.dyn_cast<EvaluatedStmt*>())
    959         S = ES->Value;
    960     }
    961 
    962     return (Expr*) S;
    963   }
    964 
    965   /// \brief Retrieve the address of the initializer expression.
    966   Stmt **getInitAddress() {
    967     if (EvaluatedStmt *ES = Init.dyn_cast<EvaluatedStmt*>())
    968       return &ES->Value;
    969 
    970     // This union hack tip-toes around strict-aliasing rules.
    971     union {
    972       InitType *InitPtr;
    973       Stmt **StmtPtr;
    974     };
    975 
    976     InitPtr = &Init;
    977     return StmtPtr;
    978   }
    979 
    980   void setInit(Expr *I);
    981 
    982   /// \brief Determine whether this variable is a reference that
    983   /// extends the lifetime of its temporary initializer.
    984   ///
    985   /// A reference extends the lifetime of its temporary initializer if
    986   /// it's initializer is an rvalue that would normally go out of scope
    987   /// at the end of the initializer (a full expression). In such cases,
    988   /// the reference itself takes ownership of the temporary, which will
    989   /// be destroyed when the reference goes out of scope. For example:
    990   ///
    991   /// \code
    992   /// const int &r = 1.0; // creates a temporary of type 'int'
    993   /// \endcode
    994   bool extendsLifetimeOfTemporary() const;
    995 
    996   EvaluatedStmt *EnsureEvaluatedStmt() const {
    997     EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>();
    998     if (!Eval) {
    999       Stmt *S = Init.get<Stmt *>();
   1000       Eval = new (getASTContext()) EvaluatedStmt;
   1001       Eval->Value = S;
   1002       Init = Eval;
   1003     }
   1004     return Eval;
   1005   }
   1006 
   1007   /// \brief Check whether we are in the process of checking whether the
   1008   /// initializer can be evaluated.
   1009   bool isEvaluatingValue() const {
   1010     if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>())
   1011       return Eval->IsEvaluating;
   1012 
   1013     return false;
   1014   }
   1015 
   1016   /// \brief Note that we now are checking whether the initializer can be
   1017   /// evaluated.
   1018   void setEvaluatingValue() const {
   1019     EvaluatedStmt *Eval = EnsureEvaluatedStmt();
   1020     Eval->IsEvaluating = true;
   1021   }
   1022 
   1023   /// \brief Note that constant evaluation has computed the given
   1024   /// value for this variable's initializer.
   1025   void setEvaluatedValue(const APValue &Value) const {
   1026     EvaluatedStmt *Eval = EnsureEvaluatedStmt();
   1027     Eval->IsEvaluating = false;
   1028     Eval->WasEvaluated = true;
   1029     Eval->Evaluated = Value;
   1030   }
   1031 
   1032   /// \brief Return the already-evaluated value of this variable's
   1033   /// initializer, or NULL if the value is not yet known. Returns pointer
   1034   /// to untyped APValue if the value could not be evaluated.
   1035   APValue *getEvaluatedValue() const {
   1036     if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>())
   1037       if (Eval->WasEvaluated)
   1038         return &Eval->Evaluated;
   1039 
   1040     return 0;
   1041   }
   1042 
   1043   /// \brief Determines whether it is already known whether the
   1044   /// initializer is an integral constant expression or not.
   1045   bool isInitKnownICE() const {
   1046     if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>())
   1047       return Eval->CheckedICE;
   1048 
   1049     return false;
   1050   }
   1051 
   1052   /// \brief Determines whether the initializer is an integral
   1053   /// constant expression.
   1054   ///
   1055   /// \pre isInitKnownICE()
   1056   bool isInitICE() const {
   1057     assert(isInitKnownICE() &&
   1058            "Check whether we already know that the initializer is an ICE");
   1059     return Init.get<EvaluatedStmt *>()->IsICE;
   1060   }
   1061 
   1062   /// \brief Check whether we are in the process of checking the initializer
   1063   /// is an integral constant expression.
   1064   bool isCheckingICE() const {
   1065     if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>())
   1066       return Eval->CheckingICE;
   1067 
   1068     return false;
   1069   }
   1070 
   1071   /// \brief Note that we now are checking whether the initializer is an
   1072   /// integral constant expression.
   1073   void setCheckingICE() const {
   1074     EvaluatedStmt *Eval = EnsureEvaluatedStmt();
   1075     Eval->CheckingICE = true;
   1076   }
   1077 
   1078   /// \brief Note that we now know whether the initializer is an
   1079   /// integral constant expression.
   1080   void setInitKnownICE(bool IsICE) const {
   1081     EvaluatedStmt *Eval = EnsureEvaluatedStmt();
   1082     Eval->CheckingICE = false;
   1083     Eval->CheckedICE = true;
   1084     Eval->IsICE = IsICE;
   1085   }
   1086 
   1087   void setCXXDirectInitializer(bool T) { VarDeclBits.HasCXXDirectInit = T; }
   1088 
   1089   /// hasCXXDirectInitializer - If true, the initializer was a direct
   1090   /// initializer, e.g: "int x(1);". The Init expression will be the expression
   1091   /// inside the parens or a "ClassType(a,b,c)" class constructor expression for
   1092   /// class types. Clients can distinguish between "int x(1);" and "int x=1;"
   1093   /// by checking hasCXXDirectInitializer.
   1094   ///
   1095   bool hasCXXDirectInitializer() const {
   1096     return VarDeclBits.HasCXXDirectInit;
   1097   }
   1098 
   1099   /// \brief Determine whether this variable is the exception variable in a
   1100   /// C++ catch statememt or an Objective-C @catch statement.
   1101   bool isExceptionVariable() const {
   1102     return VarDeclBits.ExceptionVar;
   1103   }
   1104   void setExceptionVariable(bool EV) { VarDeclBits.ExceptionVar = EV; }
   1105 
   1106   /// \brief Determine whether this local variable can be used with the named
   1107   /// return value optimization (NRVO).
   1108   ///
   1109   /// The named return value optimization (NRVO) works by marking certain
   1110   /// non-volatile local variables of class type as NRVO objects. These
   1111   /// locals can be allocated within the return slot of their containing
   1112   /// function, in which case there is no need to copy the object to the
   1113   /// return slot when returning from the function. Within the function body,
   1114   /// each return that returns the NRVO object will have this variable as its
   1115   /// NRVO candidate.
   1116   bool isNRVOVariable() const { return VarDeclBits.NRVOVariable; }
   1117   void setNRVOVariable(bool NRVO) { VarDeclBits.NRVOVariable = NRVO; }
   1118 
   1119   /// \brief Determine whether this variable is the for-range-declaration in
   1120   /// a C++0x for-range statement.
   1121   bool isCXXForRangeDecl() const { return VarDeclBits.CXXForRangeDecl; }
   1122   void setCXXForRangeDecl(bool FRD) { VarDeclBits.CXXForRangeDecl = FRD; }
   1123 
   1124   /// \brief Determine whether this variable is an ARC pseudo-__strong
   1125   /// variable.  A pseudo-__strong variable has a __strong-qualified
   1126   /// type but does not actually retain the object written into it.
   1127   /// Generally such variables are also 'const' for safety.
   1128   bool isARCPseudoStrong() const { return VarDeclBits.ARCPseudoStrong; }
   1129   void setARCPseudoStrong(bool ps) { VarDeclBits.ARCPseudoStrong = ps; }
   1130 
   1131   /// \brief If this variable is an instantiated static data member of a
   1132   /// class template specialization, returns the templated static data member
   1133   /// from which it was instantiated.
   1134   VarDecl *getInstantiatedFromStaticDataMember() const;
   1135 
   1136   /// \brief If this variable is a static data member, determine what kind of
   1137   /// template specialization or instantiation this is.
   1138   TemplateSpecializationKind getTemplateSpecializationKind() const;
   1139 
   1140   /// \brief If this variable is an instantiation of a static data member of a
   1141   /// class template specialization, retrieves the member specialization
   1142   /// information.
   1143   MemberSpecializationInfo *getMemberSpecializationInfo() const;
   1144 
   1145   /// \brief For a static data member that was instantiated from a static
   1146   /// data member of a class template, set the template specialiation kind.
   1147   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   1148                         SourceLocation PointOfInstantiation = SourceLocation());
   1149 
   1150   // Implement isa/cast/dyncast/etc.
   1151   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1152   static bool classof(const VarDecl *D) { return true; }
   1153   static bool classofKind(Kind K) { return K >= firstVar && K <= lastVar; }
   1154 };
   1155 
   1156 class ImplicitParamDecl : public VarDecl {
   1157 public:
   1158   static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC,
   1159                                    SourceLocation IdLoc, IdentifierInfo *Id,
   1160                                    QualType T);
   1161 
   1162   ImplicitParamDecl(DeclContext *DC, SourceLocation IdLoc,
   1163                     IdentifierInfo *Id, QualType Type)
   1164     : VarDecl(ImplicitParam, DC, IdLoc, IdLoc, Id, Type,
   1165               /*tinfo*/ 0, SC_None, SC_None) {
   1166     setImplicit();
   1167   }
   1168 
   1169   // Implement isa/cast/dyncast/etc.
   1170   static bool classof(const ImplicitParamDecl *D) { return true; }
   1171   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1172   static bool classofKind(Kind K) { return K == ImplicitParam; }
   1173 };
   1174 
   1175 /// ParmVarDecl - Represents a parameter to a function.
   1176 class ParmVarDecl : public VarDecl {
   1177 public:
   1178   enum { MaxFunctionScopeDepth = 255 };
   1179   enum { MaxFunctionScopeIndex = 255 };
   1180 
   1181 protected:
   1182   ParmVarDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
   1183               SourceLocation IdLoc, IdentifierInfo *Id,
   1184               QualType T, TypeSourceInfo *TInfo,
   1185               StorageClass S, StorageClass SCAsWritten, Expr *DefArg)
   1186     : VarDecl(DK, DC, StartLoc, IdLoc, Id, T, TInfo, S, SCAsWritten) {
   1187     assert(ParmVarDeclBits.HasInheritedDefaultArg == false);
   1188     assert(ParmVarDeclBits.IsKNRPromoted == false);
   1189     assert(ParmVarDeclBits.IsObjCMethodParam == false);
   1190     setDefaultArg(DefArg);
   1191   }
   1192 
   1193 public:
   1194   static ParmVarDecl *Create(ASTContext &C, DeclContext *DC,
   1195                              SourceLocation StartLoc,
   1196                              SourceLocation IdLoc, IdentifierInfo *Id,
   1197                              QualType T, TypeSourceInfo *TInfo,
   1198                              StorageClass S, StorageClass SCAsWritten,
   1199                              Expr *DefArg);
   1200 
   1201   void setObjCMethodScopeInfo(unsigned parameterIndex) {
   1202     ParmVarDeclBits.IsObjCMethodParam = true;
   1203 
   1204     ParmVarDeclBits.ParameterIndex = parameterIndex;
   1205     assert(ParmVarDeclBits.ParameterIndex == parameterIndex && "truncation!");
   1206   }
   1207 
   1208   void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex) {
   1209     assert(!ParmVarDeclBits.IsObjCMethodParam);
   1210 
   1211     ParmVarDeclBits.ScopeDepthOrObjCQuals = scopeDepth;
   1212     assert(ParmVarDeclBits.ScopeDepthOrObjCQuals == scopeDepth && "truncation!");
   1213 
   1214     ParmVarDeclBits.ParameterIndex = parameterIndex;
   1215     assert(ParmVarDeclBits.ParameterIndex == parameterIndex && "truncation!");
   1216   }
   1217 
   1218   bool isObjCMethodParameter() const {
   1219     return ParmVarDeclBits.IsObjCMethodParam;
   1220   }
   1221 
   1222   unsigned getFunctionScopeDepth() const {
   1223     if (ParmVarDeclBits.IsObjCMethodParam) return 0;
   1224     return ParmVarDeclBits.ScopeDepthOrObjCQuals;
   1225   }
   1226 
   1227   /// Returns the index of this parameter in its prototype or method scope.
   1228   unsigned getFunctionScopeIndex() const {
   1229     return ParmVarDeclBits.ParameterIndex;
   1230   }
   1231 
   1232   ObjCDeclQualifier getObjCDeclQualifier() const {
   1233     if (!ParmVarDeclBits.IsObjCMethodParam) return OBJC_TQ_None;
   1234     return ObjCDeclQualifier(ParmVarDeclBits.ScopeDepthOrObjCQuals);
   1235   }
   1236   void setObjCDeclQualifier(ObjCDeclQualifier QTVal) {
   1237     assert(ParmVarDeclBits.IsObjCMethodParam);
   1238     ParmVarDeclBits.ScopeDepthOrObjCQuals = QTVal;
   1239   }
   1240 
   1241   /// True if the value passed to this parameter must undergo
   1242   /// K&R-style default argument promotion:
   1243   ///
   1244   /// C99 6.5.2.2.
   1245   ///   If the expression that denotes the called function has a type
   1246   ///   that does not include a prototype, the integer promotions are
   1247   ///   performed on each argument, and arguments that have type float
   1248   ///   are promoted to double.
   1249   bool isKNRPromoted() const {
   1250     return ParmVarDeclBits.IsKNRPromoted;
   1251   }
   1252   void setKNRPromoted(bool promoted) {
   1253     ParmVarDeclBits.IsKNRPromoted = promoted;
   1254   }
   1255 
   1256   Expr *getDefaultArg();
   1257   const Expr *getDefaultArg() const {
   1258     return const_cast<ParmVarDecl *>(this)->getDefaultArg();
   1259   }
   1260 
   1261   void setDefaultArg(Expr *defarg) {
   1262     Init = reinterpret_cast<Stmt *>(defarg);
   1263   }
   1264 
   1265   unsigned getNumDefaultArgTemporaries() const;
   1266   CXXTemporary *getDefaultArgTemporary(unsigned i);
   1267   const CXXTemporary *getDefaultArgTemporary(unsigned i) const {
   1268     return const_cast<ParmVarDecl *>(this)->getDefaultArgTemporary(i);
   1269   }
   1270 
   1271   /// \brief Retrieve the source range that covers the entire default
   1272   /// argument.
   1273   SourceRange getDefaultArgRange() const;
   1274   void setUninstantiatedDefaultArg(Expr *arg) {
   1275     Init = reinterpret_cast<UninstantiatedDefaultArgument *>(arg);
   1276   }
   1277   Expr *getUninstantiatedDefaultArg() {
   1278     return (Expr *)Init.get<UninstantiatedDefaultArgument *>();
   1279   }
   1280   const Expr *getUninstantiatedDefaultArg() const {
   1281     return (const Expr *)Init.get<UninstantiatedDefaultArgument *>();
   1282   }
   1283 
   1284   /// hasDefaultArg - Determines whether this parameter has a default argument,
   1285   /// either parsed or not.
   1286   bool hasDefaultArg() const {
   1287     return getInit() || hasUnparsedDefaultArg() ||
   1288       hasUninstantiatedDefaultArg();
   1289   }
   1290 
   1291   /// hasUnparsedDefaultArg - Determines whether this parameter has a
   1292   /// default argument that has not yet been parsed. This will occur
   1293   /// during the processing of a C++ class whose member functions have
   1294   /// default arguments, e.g.,
   1295   /// @code
   1296   ///   class X {
   1297   ///   public:
   1298   ///     void f(int x = 17); // x has an unparsed default argument now
   1299   ///   }; // x has a regular default argument now
   1300   /// @endcode
   1301   bool hasUnparsedDefaultArg() const {
   1302     return Init.is<UnparsedDefaultArgument*>();
   1303   }
   1304 
   1305   bool hasUninstantiatedDefaultArg() const {
   1306     return Init.is<UninstantiatedDefaultArgument*>();
   1307   }
   1308 
   1309   /// setUnparsedDefaultArg - Specify that this parameter has an
   1310   /// unparsed default argument. The argument will be replaced with a
   1311   /// real default argument via setDefaultArg when the class
   1312   /// definition enclosing the function declaration that owns this
   1313   /// default argument is completed.
   1314   void setUnparsedDefaultArg() {
   1315     Init = (UnparsedDefaultArgument *)0;
   1316   }
   1317 
   1318   bool hasInheritedDefaultArg() const {
   1319     return ParmVarDeclBits.HasInheritedDefaultArg;
   1320   }
   1321 
   1322   void setHasInheritedDefaultArg(bool I = true) {
   1323     ParmVarDeclBits.HasInheritedDefaultArg = I;
   1324   }
   1325 
   1326   QualType getOriginalType() const {
   1327     if (getTypeSourceInfo())
   1328       return getTypeSourceInfo()->getType();
   1329     return getType();
   1330   }
   1331 
   1332   /// \brief Determine whether this parameter is actually a function
   1333   /// parameter pack.
   1334   bool isParameterPack() const;
   1335 
   1336   /// setOwningFunction - Sets the function declaration that owns this
   1337   /// ParmVarDecl. Since ParmVarDecls are often created before the
   1338   /// FunctionDecls that own them, this routine is required to update
   1339   /// the DeclContext appropriately.
   1340   void setOwningFunction(DeclContext *FD) { setDeclContext(FD); }
   1341 
   1342   // Implement isa/cast/dyncast/etc.
   1343   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1344   static bool classof(const ParmVarDecl *D) { return true; }
   1345   static bool classofKind(Kind K) { return K == ParmVar; }
   1346 };
   1347 
   1348 /// FunctionDecl - An instance of this class is created to represent a
   1349 /// function declaration or definition.
   1350 ///
   1351 /// Since a given function can be declared several times in a program,
   1352 /// there may be several FunctionDecls that correspond to that
   1353 /// function. Only one of those FunctionDecls will be found when
   1354 /// traversing the list of declarations in the context of the
   1355 /// FunctionDecl (e.g., the translation unit); this FunctionDecl
   1356 /// contains all of the information known about the function. Other,
   1357 /// previous declarations of the function are available via the
   1358 /// getPreviousDeclaration() chain.
   1359 class FunctionDecl : public DeclaratorDecl, public DeclContext,
   1360                      public Redeclarable<FunctionDecl> {
   1361 public:
   1362   typedef clang::StorageClass StorageClass;
   1363 
   1364   /// \brief The kind of templated function a FunctionDecl can be.
   1365   enum TemplatedKind {
   1366     TK_NonTemplate,
   1367     TK_FunctionTemplate,
   1368     TK_MemberSpecialization,
   1369     TK_FunctionTemplateSpecialization,
   1370     TK_DependentFunctionTemplateSpecialization
   1371   };
   1372 
   1373 private:
   1374   /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
   1375   /// parameters of this function.  This is null if a prototype or if there are
   1376   /// no formals.
   1377   ParmVarDecl **ParamInfo;
   1378 
   1379   LazyDeclStmtPtr Body;
   1380 
   1381   // FIXME: This can be packed into the bitfields in Decl.
   1382   // NOTE: VC++ treats enums as signed, avoid using the StorageClass enum
   1383   unsigned SClass : 2;
   1384   unsigned SClassAsWritten : 2;
   1385   bool IsInline : 1;
   1386   bool IsInlineSpecified : 1;
   1387   bool IsVirtualAsWritten : 1;
   1388   bool IsPure : 1;
   1389   bool HasInheritedPrototype : 1;
   1390   bool HasWrittenPrototype : 1;
   1391   bool IsDeleted : 1;
   1392   bool IsTrivial : 1; // sunk from CXXMethodDecl
   1393   bool IsDefaulted : 1; // sunk from CXXMethoDecl
   1394   bool IsExplicitlyDefaulted : 1; //sunk from CXXMethodDecl
   1395   bool HasImplicitReturnZero : 1;
   1396   bool IsLateTemplateParsed : 1;
   1397 
   1398   /// \brief End part of this FunctionDecl's source range.
   1399   ///
   1400   /// We could compute the full range in getSourceRange(). However, when we're
   1401   /// dealing with a function definition deserialized from a PCH/AST file,
   1402   /// we can only compute the full range once the function body has been
   1403   /// de-serialized, so it's far better to have the (sometimes-redundant)
   1404   /// EndRangeLoc.
   1405   SourceLocation EndRangeLoc;
   1406 
   1407   /// \brief The template or declaration that this declaration
   1408   /// describes or was instantiated from, respectively.
   1409   ///
   1410   /// For non-templates, this value will be NULL. For function
   1411   /// declarations that describe a function template, this will be a
   1412   /// pointer to a FunctionTemplateDecl. For member functions
   1413   /// of class template specializations, this will be a MemberSpecializationInfo
   1414   /// pointer containing information about the specialization.
   1415   /// For function template specializations, this will be a
   1416   /// FunctionTemplateSpecializationInfo, which contains information about
   1417   /// the template being specialized and the template arguments involved in
   1418   /// that specialization.
   1419   llvm::PointerUnion4<FunctionTemplateDecl *,
   1420                       MemberSpecializationInfo *,
   1421                       FunctionTemplateSpecializationInfo *,
   1422                       DependentFunctionTemplateSpecializationInfo *>
   1423     TemplateOrSpecialization;
   1424 
   1425   /// DNLoc - Provides source/type location info for the
   1426   /// declaration name embedded in the DeclaratorDecl base class.
   1427   DeclarationNameLoc DNLoc;
   1428 
   1429   /// \brief Specify that this function declaration is actually a function
   1430   /// template specialization.
   1431   ///
   1432   /// \param C the ASTContext.
   1433   ///
   1434   /// \param Template the function template that this function template
   1435   /// specialization specializes.
   1436   ///
   1437   /// \param TemplateArgs the template arguments that produced this
   1438   /// function template specialization from the template.
   1439   ///
   1440   /// \param InsertPos If non-NULL, the position in the function template
   1441   /// specialization set where the function template specialization data will
   1442   /// be inserted.
   1443   ///
   1444   /// \param TSK the kind of template specialization this is.
   1445   ///
   1446   /// \param TemplateArgsAsWritten location info of template arguments.
   1447   ///
   1448   /// \param PointOfInstantiation point at which the function template
   1449   /// specialization was first instantiated.
   1450   void setFunctionTemplateSpecialization(ASTContext &C,
   1451                                          FunctionTemplateDecl *Template,
   1452                                        const TemplateArgumentList *TemplateArgs,
   1453                                          void *InsertPos,
   1454                                          TemplateSpecializationKind TSK,
   1455                           const TemplateArgumentListInfo *TemplateArgsAsWritten,
   1456                                          SourceLocation PointOfInstantiation);
   1457 
   1458   /// \brief Specify that this record is an instantiation of the
   1459   /// member function FD.
   1460   void setInstantiationOfMemberFunction(ASTContext &C, FunctionDecl *FD,
   1461                                         TemplateSpecializationKind TSK);
   1462 
   1463   void setParams(ASTContext &C, ParmVarDecl **NewParamInfo, unsigned NumParams);
   1464 
   1465 protected:
   1466   FunctionDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
   1467                const DeclarationNameInfo &NameInfo,
   1468                QualType T, TypeSourceInfo *TInfo,
   1469                StorageClass S, StorageClass SCAsWritten, bool isInlineSpecified)
   1470     : DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo,
   1471                      StartLoc),
   1472       DeclContext(DK),
   1473       ParamInfo(0), Body(),
   1474       SClass(S), SClassAsWritten(SCAsWritten),
   1475       IsInline(isInlineSpecified), IsInlineSpecified(isInlineSpecified),
   1476       IsVirtualAsWritten(false), IsPure(false), HasInheritedPrototype(false),
   1477       HasWrittenPrototype(true), IsDeleted(false), IsTrivial(false),
   1478       IsDefaulted(false), IsExplicitlyDefaulted(false),
   1479       HasImplicitReturnZero(false), IsLateTemplateParsed(false),
   1480       EndRangeLoc(NameInfo.getEndLoc()),
   1481       TemplateOrSpecialization(),
   1482       DNLoc(NameInfo.getInfo()) {}
   1483 
   1484   typedef Redeclarable<FunctionDecl> redeclarable_base;
   1485   virtual FunctionDecl *getNextRedeclaration() { return RedeclLink.getNext(); }
   1486 
   1487 public:
   1488   typedef redeclarable_base::redecl_iterator redecl_iterator;
   1489   redecl_iterator redecls_begin() const {
   1490     return redeclarable_base::redecls_begin();
   1491   }
   1492   redecl_iterator redecls_end() const {
   1493     return redeclarable_base::redecls_end();
   1494   }
   1495 
   1496   static FunctionDecl *Create(ASTContext &C, DeclContext *DC,
   1497                               SourceLocation StartLoc, SourceLocation NLoc,
   1498                               DeclarationName N, QualType T,
   1499                               TypeSourceInfo *TInfo,
   1500                               StorageClass SC = SC_None,
   1501                               StorageClass SCAsWritten = SC_None,
   1502                               bool isInlineSpecified = false,
   1503                               bool hasWrittenPrototype = true) {
   1504     DeclarationNameInfo NameInfo(N, NLoc);
   1505     return FunctionDecl::Create(C, DC, StartLoc, NameInfo, T, TInfo,
   1506                                 SC, SCAsWritten,
   1507                                 isInlineSpecified, hasWrittenPrototype);
   1508   }
   1509 
   1510   static FunctionDecl *Create(ASTContext &C, DeclContext *DC,
   1511                               SourceLocation StartLoc,
   1512                               const DeclarationNameInfo &NameInfo,
   1513                               QualType T, TypeSourceInfo *TInfo,
   1514                               StorageClass SC = SC_None,
   1515                               StorageClass SCAsWritten = SC_None,
   1516                               bool isInlineSpecified = false,
   1517                               bool hasWrittenPrototype = true);
   1518 
   1519   DeclarationNameInfo getNameInfo() const {
   1520     return DeclarationNameInfo(getDeclName(), getLocation(), DNLoc);
   1521   }
   1522 
   1523   virtual void getNameForDiagnostic(std::string &S,
   1524                                     const PrintingPolicy &Policy,
   1525                                     bool Qualified) const;
   1526 
   1527   void setRangeEnd(SourceLocation E) { EndRangeLoc = E; }
   1528 
   1529   virtual SourceRange getSourceRange() const;
   1530 
   1531   /// \brief Returns true if the function has a body (definition). The
   1532   /// function body might be in any of the (re-)declarations of this
   1533   /// function. The variant that accepts a FunctionDecl pointer will
   1534   /// set that function declaration to the actual declaration
   1535   /// containing the body (if there is one).
   1536   bool hasBody(const FunctionDecl *&Definition) const;
   1537 
   1538   virtual bool hasBody() const {
   1539     const FunctionDecl* Definition;
   1540     return hasBody(Definition);
   1541   }
   1542 
   1543   /// hasTrivialBody - Returns whether the function has a trivial body that does
   1544   /// not require any specific codegen.
   1545   bool hasTrivialBody() const;
   1546 
   1547   /// isDefined - Returns true if the function is defined at all, including
   1548   /// a deleted definition. Except for the behavior when the function is
   1549   /// deleted, behaves like hasBody.
   1550   bool isDefined(const FunctionDecl *&Definition) const;
   1551 
   1552   virtual bool isDefined() const {
   1553     const FunctionDecl* Definition;
   1554     return isDefined(Definition);
   1555   }
   1556 
   1557   /// getBody - Retrieve the body (definition) of the function. The
   1558   /// function body might be in any of the (re-)declarations of this
   1559   /// function. The variant that accepts a FunctionDecl pointer will
   1560   /// set that function declaration to the actual declaration
   1561   /// containing the body (if there is one).
   1562   /// NOTE: For checking if there is a body, use hasBody() instead, to avoid
   1563   /// unnecessary AST de-serialization of the body.
   1564   Stmt *getBody(const FunctionDecl *&Definition) const;
   1565 
   1566   virtual Stmt *getBody() const {
   1567     const FunctionDecl* Definition;
   1568     return getBody(Definition);
   1569   }
   1570 
   1571   /// isThisDeclarationADefinition - Returns whether this specific
   1572   /// declaration of the function is also a definition. This does not
   1573   /// determine whether the function has been defined (e.g., in a
   1574   /// previous definition); for that information, use isDefined. Note
   1575   /// that this returns false for a defaulted function unless that function
   1576   /// has been implicitly defined (possibly as deleted).
   1577   bool isThisDeclarationADefinition() const {
   1578     return IsDeleted || Body || IsLateTemplateParsed;
   1579   }
   1580 
   1581   /// doesThisDeclarationHaveABody - Returns whether this specific
   1582   /// declaration of the function has a body - that is, if it is a non-
   1583   /// deleted definition.
   1584   bool doesThisDeclarationHaveABody() const {
   1585     return Body || IsLateTemplateParsed;
   1586   }
   1587 
   1588   void setBody(Stmt *B);
   1589   void setLazyBody(uint64_t Offset) { Body = Offset; }
   1590 
   1591   /// Whether this function is variadic.
   1592   bool isVariadic() const;
   1593 
   1594   /// Whether this function is marked as virtual explicitly.
   1595   bool isVirtualAsWritten() const { return IsVirtualAsWritten; }
   1596   void setVirtualAsWritten(bool V) { IsVirtualAsWritten = V; }
   1597 
   1598   /// Whether this virtual function is pure, i.e. makes the containing class
   1599   /// abstract.
   1600   bool isPure() const { return IsPure; }
   1601   void setPure(bool P = true);
   1602 
   1603   /// Whether this is a constexpr function or constexpr constructor.
   1604   // FIXME: C++0x: Implement tracking of the constexpr specifier.
   1605   bool isConstExpr() const { return false; }
   1606 
   1607   /// Whether this templated function will be late parsed.
   1608   bool isLateTemplateParsed() const { return IsLateTemplateParsed; }
   1609   void setLateTemplateParsed(bool ILT = true) { IsLateTemplateParsed = ILT; }
   1610 
   1611   /// Whether this function is "trivial" in some specialized C++ senses.
   1612   /// Can only be true for default constructors, copy constructors,
   1613   /// copy assignment operators, and destructors.  Not meaningful until
   1614   /// the class has been fully built by Sema.
   1615   bool isTrivial() const { return IsTrivial; }
   1616   void setTrivial(bool IT) { IsTrivial = IT; }
   1617 
   1618   /// Whether this function is defaulted per C++0x. Only valid for
   1619   /// special member functions.
   1620   bool isDefaulted() const { return IsDefaulted; }
   1621   void setDefaulted(bool D = true) { IsDefaulted = D; }
   1622 
   1623   /// Whether this function is explicitly defaulted per C++0x. Only valid
   1624   /// for special member functions.
   1625   bool isExplicitlyDefaulted() const { return IsExplicitlyDefaulted; }
   1626   void setExplicitlyDefaulted(bool ED = true) { IsExplicitlyDefaulted = ED; }
   1627 
   1628   /// Whether falling off this function implicitly returns null/zero.
   1629   /// If a more specific implicit return value is required, front-ends
   1630   /// should synthesize the appropriate return statements.
   1631   bool hasImplicitReturnZero() const { return HasImplicitReturnZero; }
   1632   void setHasImplicitReturnZero(bool IRZ) { HasImplicitReturnZero = IRZ; }
   1633 
   1634   /// \brief Whether this function has a prototype, either because one
   1635   /// was explicitly written or because it was "inherited" by merging
   1636   /// a declaration without a prototype with a declaration that has a
   1637   /// prototype.
   1638   bool hasPrototype() const {
   1639     return HasWrittenPrototype || HasInheritedPrototype;
   1640   }
   1641 
   1642   bool hasWrittenPrototype() const { return HasWrittenPrototype; }
   1643 
   1644   /// \brief Whether this function inherited its prototype from a
   1645   /// previous declaration.
   1646   bool hasInheritedPrototype() const { return HasInheritedPrototype; }
   1647   void setHasInheritedPrototype(bool P = true) { HasInheritedPrototype = P; }
   1648 
   1649   /// \brief Whether this function has been deleted.
   1650   ///
   1651   /// A function that is "deleted" (via the C++0x "= delete" syntax)
   1652   /// acts like a normal function, except that it cannot actually be
   1653   /// called or have its address taken. Deleted functions are
   1654   /// typically used in C++ overload resolution to attract arguments
   1655   /// whose type or lvalue/rvalue-ness would permit the use of a
   1656   /// different overload that would behave incorrectly. For example,
   1657   /// one might use deleted functions to ban implicit conversion from
   1658   /// a floating-point number to an Integer type:
   1659   ///
   1660   /// @code
   1661   /// struct Integer {
   1662   ///   Integer(long); // construct from a long
   1663   ///   Integer(double) = delete; // no construction from float or double
   1664   ///   Integer(long double) = delete; // no construction from long double
   1665   /// };
   1666   /// @endcode
   1667   // If a function is deleted, its first declaration must be.
   1668   bool isDeleted() const { return getCanonicalDecl()->IsDeleted; }
   1669   bool isDeletedAsWritten() const { return IsDeleted && !IsDefaulted; }
   1670   void setDeletedAsWritten(bool D = true) { IsDeleted = D; }
   1671 
   1672   /// \brief Determines whether this function is "main", which is the
   1673   /// entry point into an executable program.
   1674   bool isMain() const;
   1675 
   1676   /// \brief Determines whether this operator new or delete is one
   1677   /// of the reserved global placement operators:
   1678   ///    void *operator new(size_t, void *);
   1679   ///    void *operator new[](size_t, void *);
   1680   ///    void operator delete(void *, void *);
   1681   ///    void operator delete[](void *, void *);
   1682   /// These functions have special behavior under [new.delete.placement]:
   1683   ///    These functions are reserved, a C++ program may not define
   1684   ///    functions that displace the versions in the Standard C++ library.
   1685   ///    The provisions of [basic.stc.dynamic] do not apply to these
   1686   ///    reserved placement forms of operator new and operator delete.
   1687   ///
   1688   /// This function must be an allocation or deallocation function.
   1689   bool isReservedGlobalPlacementOperator() const;
   1690 
   1691   /// \brief Determines whether this function is a function with
   1692   /// external, C linkage.
   1693   bool isExternC() const;
   1694 
   1695   /// \brief Determines whether this is a global function.
   1696   bool isGlobal() const;
   1697 
   1698   void setPreviousDeclaration(FunctionDecl * PrevDecl);
   1699 
   1700   virtual const FunctionDecl *getCanonicalDecl() const;
   1701   virtual FunctionDecl *getCanonicalDecl();
   1702 
   1703   unsigned getBuiltinID() const;
   1704 
   1705   // Iterator access to formal parameters.
   1706   unsigned param_size() const { return getNumParams(); }
   1707   typedef ParmVarDecl **param_iterator;
   1708   typedef ParmVarDecl * const *param_const_iterator;
   1709 
   1710   param_iterator param_begin() { return ParamInfo; }
   1711   param_iterator param_end()   { return ParamInfo+param_size(); }
   1712 
   1713   param_const_iterator param_begin() const { return ParamInfo; }
   1714   param_const_iterator param_end() const   { return ParamInfo+param_size(); }
   1715 
   1716   /// getNumParams - Return the number of parameters this function must have
   1717   /// based on its FunctionType.  This is the length of the ParamInfo array
   1718   /// after it has been created.
   1719   unsigned getNumParams() const;
   1720 
   1721   const ParmVarDecl *getParamDecl(unsigned i) const {
   1722     assert(i < getNumParams() && "Illegal param #");
   1723     return ParamInfo[i];
   1724   }
   1725   ParmVarDecl *getParamDecl(unsigned i) {
   1726     assert(i < getNumParams() && "Illegal param #");
   1727     return ParamInfo[i];
   1728   }
   1729   void setParams(ParmVarDecl **NewParamInfo, unsigned NumParams) {
   1730     setParams(getASTContext(), NewParamInfo, NumParams);
   1731   }
   1732 
   1733   /// getMinRequiredArguments - Returns the minimum number of arguments
   1734   /// needed to call this function. This may be fewer than the number of
   1735   /// function parameters, if some of the parameters have default
   1736   /// arguments (in C++).
   1737   unsigned getMinRequiredArguments() const;
   1738 
   1739   QualType getResultType() const {
   1740     return getType()->getAs<FunctionType>()->getResultType();
   1741   }
   1742 
   1743   /// \brief Determine the type of an expression that calls this function.
   1744   QualType getCallResultType() const {
   1745     return getType()->getAs<FunctionType>()->getCallResultType(getASTContext());
   1746   }
   1747 
   1748   StorageClass getStorageClass() const { return StorageClass(SClass); }
   1749   void setStorageClass(StorageClass SC);
   1750 
   1751   StorageClass getStorageClassAsWritten() const {
   1752     return StorageClass(SClassAsWritten);
   1753   }
   1754 
   1755   /// \brief Determine whether the "inline" keyword was specified for this
   1756   /// function.
   1757   bool isInlineSpecified() const { return IsInlineSpecified; }
   1758 
   1759   /// Set whether the "inline" keyword was specified for this function.
   1760   void setInlineSpecified(bool I) {
   1761     IsInlineSpecified = I;
   1762     IsInline = I;
   1763   }
   1764 
   1765   /// Flag that this function is implicitly inline.
   1766   void setImplicitlyInline() {
   1767     IsInline = true;
   1768   }
   1769 
   1770   /// \brief Determine whether this function should be inlined, because it is
   1771   /// either marked "inline" or is a member function of a C++ class that
   1772   /// was defined in the class body.
   1773   bool isInlined() const;
   1774 
   1775   bool isInlineDefinitionExternallyVisible() const;
   1776 
   1777   bool doesDeclarationForceExternallyVisibleDefinition() const;
   1778 
   1779   /// isOverloadedOperator - Whether this function declaration
   1780   /// represents an C++ overloaded operator, e.g., "operator+".
   1781   bool isOverloadedOperator() const {
   1782     return getOverloadedOperator() != OO_None;
   1783   }
   1784 
   1785   OverloadedOperatorKind getOverloadedOperator() const;
   1786 
   1787   const IdentifierInfo *getLiteralIdentifier() const;
   1788 
   1789   /// \brief If this function is an instantiation of a member function
   1790   /// of a class template specialization, retrieves the function from
   1791   /// which it was instantiated.
   1792   ///
   1793   /// This routine will return non-NULL for (non-templated) member
   1794   /// functions of class templates and for instantiations of function
   1795   /// templates. For example, given:
   1796   ///
   1797   /// \code
   1798   /// template<typename T>
   1799   /// struct X {
   1800   ///   void f(T);
   1801   /// };
   1802   /// \endcode
   1803   ///
   1804   /// The declaration for X<int>::f is a (non-templated) FunctionDecl
   1805   /// whose parent is the class template specialization X<int>. For
   1806   /// this declaration, getInstantiatedFromFunction() will return
   1807   /// the FunctionDecl X<T>::A. When a complete definition of
   1808   /// X<int>::A is required, it will be instantiated from the
   1809   /// declaration returned by getInstantiatedFromMemberFunction().
   1810   FunctionDecl *getInstantiatedFromMemberFunction() const;
   1811 
   1812   /// \brief What kind of templated function this is.
   1813   TemplatedKind getTemplatedKind() const;
   1814 
   1815   /// \brief If this function is an instantiation of a member function of a
   1816   /// class template specialization, retrieves the member specialization
   1817   /// information.
   1818   MemberSpecializationInfo *getMemberSpecializationInfo() const;
   1819 
   1820   /// \brief Specify that this record is an instantiation of the
   1821   /// member function FD.
   1822   void setInstantiationOfMemberFunction(FunctionDecl *FD,
   1823                                         TemplateSpecializationKind TSK) {
   1824     setInstantiationOfMemberFunction(getASTContext(), FD, TSK);
   1825   }
   1826 
   1827   /// \brief Retrieves the function template that is described by this
   1828   /// function declaration.
   1829   ///
   1830   /// Every function template is represented as a FunctionTemplateDecl
   1831   /// and a FunctionDecl (or something derived from FunctionDecl). The
   1832   /// former contains template properties (such as the template
   1833   /// parameter lists) while the latter contains the actual
   1834   /// description of the template's
   1835   /// contents. FunctionTemplateDecl::getTemplatedDecl() retrieves the
   1836   /// FunctionDecl that describes the function template,
   1837   /// getDescribedFunctionTemplate() retrieves the
   1838   /// FunctionTemplateDecl from a FunctionDecl.
   1839   FunctionTemplateDecl *getDescribedFunctionTemplate() const {
   1840     return TemplateOrSpecialization.dyn_cast<FunctionTemplateDecl*>();
   1841   }
   1842 
   1843   void setDescribedFunctionTemplate(FunctionTemplateDecl *Template) {
   1844     TemplateOrSpecialization = Template;
   1845   }
   1846 
   1847   /// \brief Determine whether this function is a function template
   1848   /// specialization.
   1849   bool isFunctionTemplateSpecialization() const {
   1850     return getPrimaryTemplate() != 0;
   1851   }
   1852 
   1853   /// \brief If this function is actually a function template specialization,
   1854   /// retrieve information about this function template specialization.
   1855   /// Otherwise, returns NULL.
   1856   FunctionTemplateSpecializationInfo *getTemplateSpecializationInfo() const {
   1857     return TemplateOrSpecialization.
   1858              dyn_cast<FunctionTemplateSpecializationInfo*>();
   1859   }
   1860 
   1861   /// \brief Determines whether this function is a function template
   1862   /// specialization or a member of a class template specialization that can
   1863   /// be implicitly instantiated.
   1864   bool isImplicitlyInstantiable() const;
   1865 
   1866   /// \brief Retrieve the function declaration from which this function could
   1867   /// be instantiated, if it is an instantiation (rather than a non-template
   1868   /// or a specialization, for example).
   1869   FunctionDecl *getTemplateInstantiationPattern() const;
   1870 
   1871   /// \brief Retrieve the primary template that this function template
   1872   /// specialization either specializes or was instantiated from.
   1873   ///
   1874   /// If this function declaration is not a function template specialization,
   1875   /// returns NULL.
   1876   FunctionTemplateDecl *getPrimaryTemplate() const;
   1877 
   1878   /// \brief Retrieve the template arguments used to produce this function
   1879   /// template specialization from the primary template.
   1880   ///
   1881   /// If this function declaration is not a function template specialization,
   1882   /// returns NULL.
   1883   const TemplateArgumentList *getTemplateSpecializationArgs() const;
   1884 
   1885   /// \brief Retrieve the template argument list as written in the sources,
   1886   /// if any.
   1887   ///
   1888   /// If this function declaration is not a function template specialization
   1889   /// or if it had no explicit template argument list, returns NULL.
   1890   /// Note that it an explicit template argument list may be written empty,
   1891   /// e.g., template<> void foo<>(char* s);
   1892   const TemplateArgumentListInfo*
   1893   getTemplateSpecializationArgsAsWritten() const;
   1894 
   1895   /// \brief Specify that this function declaration is actually a function
   1896   /// template specialization.
   1897   ///
   1898   /// \param Template the function template that this function template
   1899   /// specialization specializes.
   1900   ///
   1901   /// \param TemplateArgs the template arguments that produced this
   1902   /// function template specialization from the template.
   1903   ///
   1904   /// \param InsertPos If non-NULL, the position in the function template
   1905   /// specialization set where the function template specialization data will
   1906   /// be inserted.
   1907   ///
   1908   /// \param TSK the kind of template specialization this is.
   1909   ///
   1910   /// \param TemplateArgsAsWritten location info of template arguments.
   1911   ///
   1912   /// \param PointOfInstantiation point at which the function template
   1913   /// specialization was first instantiated.
   1914   void setFunctionTemplateSpecialization(FunctionTemplateDecl *Template,
   1915                                       const TemplateArgumentList *TemplateArgs,
   1916                                          void *InsertPos,
   1917                     TemplateSpecializationKind TSK = TSK_ImplicitInstantiation,
   1918                     const TemplateArgumentListInfo *TemplateArgsAsWritten = 0,
   1919                     SourceLocation PointOfInstantiation = SourceLocation()) {
   1920     setFunctionTemplateSpecialization(getASTContext(), Template, TemplateArgs,
   1921                                       InsertPos, TSK, TemplateArgsAsWritten,
   1922                                       PointOfInstantiation);
   1923   }
   1924 
   1925   /// \brief Specifies that this function declaration is actually a
   1926   /// dependent function template specialization.
   1927   void setDependentTemplateSpecialization(ASTContext &Context,
   1928                              const UnresolvedSetImpl &Templates,
   1929                       const TemplateArgumentListInfo &TemplateArgs);
   1930 
   1931   DependentFunctionTemplateSpecializationInfo *
   1932   getDependentSpecializationInfo() const {
   1933     return TemplateOrSpecialization.
   1934              dyn_cast<DependentFunctionTemplateSpecializationInfo*>();
   1935   }
   1936 
   1937   /// \brief Determine what kind of template instantiation this function
   1938   /// represents.
   1939   TemplateSpecializationKind getTemplateSpecializationKind() const;
   1940 
   1941   /// \brief Determine what kind of template instantiation this function
   1942   /// represents.
   1943   void setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   1944                         SourceLocation PointOfInstantiation = SourceLocation());
   1945 
   1946   /// \brief Retrieve the (first) point of instantiation of a function template
   1947   /// specialization or a member of a class template specialization.
   1948   ///
   1949   /// \returns the first point of instantiation, if this function was
   1950   /// instantiated from a template; otherwie, returns an invalid source
   1951   /// location.
   1952   SourceLocation getPointOfInstantiation() const;
   1953 
   1954   /// \brief Determine whether this is or was instantiated from an out-of-line
   1955   /// definition of a member function.
   1956   virtual bool isOutOfLine() const;
   1957 
   1958   // Implement isa/cast/dyncast/etc.
   1959   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   1960   static bool classof(const FunctionDecl *D) { return true; }
   1961   static bool classofKind(Kind K) {
   1962     return K >= firstFunction && K <= lastFunction;
   1963   }
   1964   static DeclContext *castToDeclContext(const FunctionDecl *D) {
   1965     return static_cast<DeclContext *>(const_cast<FunctionDecl*>(D));
   1966   }
   1967   static FunctionDecl *castFromDeclContext(const DeclContext *DC) {
   1968     return static_cast<FunctionDecl *>(const_cast<DeclContext*>(DC));
   1969   }
   1970 
   1971   friend class ASTDeclReader;
   1972   friend class ASTDeclWriter;
   1973 };
   1974 
   1975 
   1976 /// FieldDecl - An instance of this class is created by Sema::ActOnField to
   1977 /// represent a member of a struct/union/class.
   1978 class FieldDecl : public DeclaratorDecl {
   1979   // FIXME: This can be packed into the bitfields in Decl.
   1980   bool Mutable : 1;
   1981   mutable unsigned CachedFieldIndex : 31;
   1982 
   1983   /// \brief A pointer to either the in-class initializer for this field (if
   1984   /// the boolean value is false), or the bit width expression for this bit
   1985   /// field (if the boolean value is true).
   1986   ///
   1987   /// We can safely combine these two because in-class initializers are not
   1988   /// permitted for bit-fields.
   1989   ///
   1990   /// If the boolean is false and the initializer is null, then this field has
   1991   /// an in-class initializer which has not yet been parsed and attached.
   1992   llvm::PointerIntPair<Expr *, 1, bool> InitializerOrBitWidth;
   1993 protected:
   1994   FieldDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
   1995             SourceLocation IdLoc, IdentifierInfo *Id,
   1996             QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
   1997             bool HasInit)
   1998     : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc),
   1999       Mutable(Mutable), CachedFieldIndex(0),
   2000       InitializerOrBitWidth(BW, !HasInit) {
   2001     assert(!(BW && HasInit) && "got initializer for bitfield");
   2002   }
   2003 
   2004 public:
   2005   static FieldDecl *Create(const ASTContext &C, DeclContext *DC,
   2006                            SourceLocation StartLoc, SourceLocation IdLoc,
   2007                            IdentifierInfo *Id, QualType T,
   2008                            TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
   2009                            bool HasInit);
   2010 
   2011   /// getFieldIndex - Returns the index of this field within its record,
   2012   /// as appropriate for passing to ASTRecordLayout::getFieldOffset.
   2013   unsigned getFieldIndex() const;
   2014 
   2015   /// isMutable - Determines whether this field is mutable (C++ only).
   2016   bool isMutable() const { return Mutable; }
   2017 
   2018   /// \brief Set whether this field is mutable (C++ only).
   2019   void setMutable(bool M) { Mutable = M; }
   2020 
   2021   /// isBitfield - Determines whether this field is a bitfield.
   2022   bool isBitField() const {
   2023     return InitializerOrBitWidth.getInt() && InitializerOrBitWidth.getPointer();
   2024   }
   2025 
   2026   /// @brief Determines whether this is an unnamed bitfield.
   2027   bool isUnnamedBitfield() const { return isBitField() && !getDeclName(); }
   2028 
   2029   /// isAnonymousStructOrUnion - Determines whether this field is a
   2030   /// representative for an anonymous struct or union. Such fields are
   2031   /// unnamed and are implicitly generated by the implementation to
   2032   /// store the data for the anonymous union or struct.
   2033   bool isAnonymousStructOrUnion() const;
   2034 
   2035   Expr *getBitWidth() const {
   2036     return isBitField() ? InitializerOrBitWidth.getPointer() : 0;
   2037   }
   2038   void setBitWidth(Expr *BW) {
   2039     assert(!InitializerOrBitWidth.getPointer() &&
   2040            "bit width or initializer already set");
   2041     InitializerOrBitWidth.setPointer(BW);
   2042     InitializerOrBitWidth.setInt(1);
   2043   }
   2044   /// removeBitWidth - Remove the bitfield width from this member.
   2045   void removeBitWidth() {
   2046     assert(isBitField() && "no bit width to remove");
   2047     InitializerOrBitWidth.setPointer(0);
   2048   }
   2049 
   2050   /// hasInClassInitializer - Determine whether this member has a C++0x in-class
   2051   /// initializer.
   2052   bool hasInClassInitializer() const {
   2053     return !InitializerOrBitWidth.getInt();
   2054   }
   2055   /// getInClassInitializer - Get the C++0x in-class initializer for this
   2056   /// member, or null if one has not been set. If a valid declaration has an
   2057   /// in-class initializer, but this returns null, then we have not parsed and
   2058   /// attached it yet.
   2059   Expr *getInClassInitializer() const {
   2060     return hasInClassInitializer() ? InitializerOrBitWidth.getPointer() : 0;
   2061   }
   2062   /// setInClassInitializer - Set the C++0x in-class initializer for this member.
   2063   void setInClassInitializer(Expr *Init);
   2064   /// removeInClassInitializer - Remove the C++0x in-class initializer from this
   2065   /// member.
   2066   void removeInClassInitializer() {
   2067     assert(!InitializerOrBitWidth.getInt() && "no initializer to remove");
   2068     InitializerOrBitWidth.setPointer(0);
   2069     InitializerOrBitWidth.setInt(1);
   2070   }
   2071 
   2072   /// getParent - Returns the parent of this field declaration, which
   2073   /// is the struct in which this method is defined.
   2074   const RecordDecl *getParent() const {
   2075     return cast<RecordDecl>(getDeclContext());
   2076   }
   2077 
   2078   RecordDecl *getParent() {
   2079     return cast<RecordDecl>(getDeclContext());
   2080   }
   2081 
   2082   SourceRange getSourceRange() const;
   2083 
   2084   // Implement isa/cast/dyncast/etc.
   2085   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2086   static bool classof(const FieldDecl *D) { return true; }
   2087   static bool classofKind(Kind K) { return K >= firstField && K <= lastField; }
   2088 };
   2089 
   2090 /// EnumConstantDecl - An instance of this object exists for each enum constant
   2091 /// that is defined.  For example, in "enum X {a,b}", each of a/b are
   2092 /// EnumConstantDecl's, X is an instance of EnumDecl, and the type of a/b is a
   2093 /// TagType for the X EnumDecl.
   2094 class EnumConstantDecl : public ValueDecl {
   2095   Stmt *Init; // an integer constant expression
   2096   llvm::APSInt Val; // The value.
   2097 protected:
   2098   EnumConstantDecl(DeclContext *DC, SourceLocation L,
   2099                    IdentifierInfo *Id, QualType T, Expr *E,
   2100                    const llvm::APSInt &V)
   2101     : ValueDecl(EnumConstant, DC, L, Id, T), Init((Stmt*)E), Val(V) {}
   2102 
   2103 public:
   2104 
   2105   static EnumConstantDecl *Create(ASTContext &C, EnumDecl *DC,
   2106                                   SourceLocation L, IdentifierInfo *Id,
   2107                                   QualType T, Expr *E,
   2108                                   const llvm::APSInt &V);
   2109 
   2110   const Expr *getInitExpr() const { return (const Expr*) Init; }
   2111   Expr *getInitExpr() { return (Expr*) Init; }
   2112   const llvm::APSInt &getInitVal() const { return Val; }
   2113 
   2114   void setInitExpr(Expr *E) { Init = (Stmt*) E; }
   2115   void setInitVal(const llvm::APSInt &V) { Val = V; }
   2116 
   2117   SourceRange getSourceRange() const;
   2118 
   2119   // Implement isa/cast/dyncast/etc.
   2120   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2121   static bool classof(const EnumConstantDecl *D) { return true; }
   2122   static bool classofKind(Kind K) { return K == EnumConstant; }
   2123 
   2124   friend class StmtIteratorBase;
   2125 };
   2126 
   2127 /// IndirectFieldDecl - An instance of this class is created to represent a
   2128 /// field injected from an anonymous union/struct into the parent scope.
   2129 /// IndirectFieldDecl are always implicit.
   2130 class IndirectFieldDecl : public ValueDecl {
   2131   NamedDecl **Chaining;
   2132   unsigned ChainingSize;
   2133 
   2134   IndirectFieldDecl(DeclContext *DC, SourceLocation L,
   2135                     DeclarationName N, QualType T,
   2136                     NamedDecl **CH, unsigned CHS)
   2137     : ValueDecl(IndirectField, DC, L, N, T), Chaining(CH), ChainingSize(CHS) {}
   2138 
   2139 public:
   2140   static IndirectFieldDecl *Create(ASTContext &C, DeclContext *DC,
   2141                                    SourceLocation L, IdentifierInfo *Id,
   2142                                    QualType T, NamedDecl **CH, unsigned CHS);
   2143 
   2144   typedef NamedDecl * const *chain_iterator;
   2145   chain_iterator chain_begin() const { return Chaining; }
   2146   chain_iterator chain_end() const  { return Chaining+ChainingSize; }
   2147 
   2148   unsigned getChainingSize() const { return ChainingSize; }
   2149 
   2150   FieldDecl *getAnonField() const {
   2151     assert(ChainingSize >= 2);
   2152     return cast<FieldDecl>(Chaining[ChainingSize - 1]);
   2153   }
   2154 
   2155   VarDecl *getVarDecl() const {
   2156     assert(ChainingSize >= 2);
   2157     return dyn_cast<VarDecl>(*chain_begin());
   2158   }
   2159 
   2160   // Implement isa/cast/dyncast/etc.
   2161   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2162   static bool classof(const IndirectFieldDecl *D) { return true; }
   2163   static bool classofKind(Kind K) { return K == IndirectField; }
   2164   friend class ASTDeclReader;
   2165 };
   2166 
   2167 /// TypeDecl - Represents a declaration of a type.
   2168 ///
   2169 class TypeDecl : public NamedDecl {
   2170   /// TypeForDecl - This indicates the Type object that represents
   2171   /// this TypeDecl.  It is a cache maintained by
   2172   /// ASTContext::getTypedefType, ASTContext::getTagDeclType, and
   2173   /// ASTContext::getTemplateTypeParmType, and TemplateTypeParmDecl.
   2174   mutable const Type *TypeForDecl;
   2175   /// LocStart - The start of the source range for this declaration.
   2176   SourceLocation LocStart;
   2177   friend class ASTContext;
   2178   friend class DeclContext;
   2179   friend class TagDecl;
   2180   friend class TemplateTypeParmDecl;
   2181   friend class TagType;
   2182 
   2183 protected:
   2184   TypeDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
   2185            SourceLocation StartL = SourceLocation())
   2186     : NamedDecl(DK, DC, L, Id), TypeForDecl(0), LocStart(StartL) {}
   2187 
   2188 public:
   2189   // Low-level accessor
   2190   const Type *getTypeForDecl() const { return TypeForDecl; }
   2191   void setTypeForDecl(const Type *TD) { TypeForDecl = TD; }
   2192 
   2193   SourceLocation getLocStart() const { return LocStart; }
   2194   void setLocStart(SourceLocation L) { LocStart = L; }
   2195   virtual SourceRange getSourceRange() const {
   2196     if (LocStart.isValid())
   2197       return SourceRange(LocStart, getLocation());
   2198     else
   2199       return SourceRange(getLocation());
   2200   }
   2201 
   2202   // Implement isa/cast/dyncast/etc.
   2203   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2204   static bool classof(const TypeDecl *D) { return true; }
   2205   static bool classofKind(Kind K) { return K >= firstType && K <= lastType; }
   2206 };
   2207 
   2208 
   2209 /// Base class for declarations which introduce a typedef-name.
   2210 class TypedefNameDecl : public TypeDecl, public Redeclarable<TypedefNameDecl> {
   2211   /// UnderlyingType - This is the type the typedef is set to.
   2212   TypeSourceInfo *TInfo;
   2213 
   2214 protected:
   2215   TypedefNameDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc,
   2216                   SourceLocation IdLoc, IdentifierInfo *Id,
   2217                   TypeSourceInfo *TInfo)
   2218     : TypeDecl(DK, DC, IdLoc, Id, StartLoc), TInfo(TInfo) {}
   2219 
   2220   typedef Redeclarable<TypedefNameDecl> redeclarable_base;
   2221   virtual TypedefNameDecl *getNextRedeclaration() {
   2222     return RedeclLink.getNext();
   2223   }
   2224 
   2225 public:
   2226   typedef redeclarable_base::redecl_iterator redecl_iterator;
   2227   redecl_iterator redecls_begin() const {
   2228     return redeclarable_base::redecls_begin();
   2229   }
   2230   redecl_iterator redecls_end() const {
   2231     return redeclarable_base::redecls_end();
   2232   }
   2233 
   2234   TypeSourceInfo *getTypeSourceInfo() const {
   2235     return TInfo;
   2236   }
   2237 
   2238   /// Retrieves the canonical declaration of this typedef-name.
   2239   TypedefNameDecl *getCanonicalDecl() {
   2240     return getFirstDeclaration();
   2241   }
   2242   const TypedefNameDecl *getCanonicalDecl() const {
   2243     return getFirstDeclaration();
   2244   }
   2245 
   2246   QualType getUnderlyingType() const {
   2247     return TInfo->getType();
   2248   }
   2249   void setTypeSourceInfo(TypeSourceInfo *newType) {
   2250     TInfo = newType;
   2251   }
   2252 
   2253   // Implement isa/cast/dyncast/etc.
   2254   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2255   static bool classof(const TypedefNameDecl *D) { return true; }
   2256   static bool classofKind(Kind K) {
   2257     return K >= firstTypedefName && K <= lastTypedefName;
   2258   }
   2259 };
   2260 
   2261 /// TypedefDecl - Represents the declaration of a typedef-name via the 'typedef'
   2262 /// type specifier.
   2263 class TypedefDecl : public TypedefNameDecl {
   2264   TypedefDecl(DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc,
   2265               IdentifierInfo *Id, TypeSourceInfo *TInfo)
   2266     : TypedefNameDecl(Typedef, DC, StartLoc, IdLoc, Id, TInfo) {}
   2267 
   2268 public:
   2269   static TypedefDecl *Create(ASTContext &C, DeclContext *DC,
   2270                              SourceLocation StartLoc, SourceLocation IdLoc,
   2271                              IdentifierInfo *Id, TypeSourceInfo *TInfo);
   2272 
   2273   SourceRange getSourceRange() const;
   2274 
   2275   // Implement isa/cast/dyncast/etc.
   2276   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2277   static bool classof(const TypedefDecl *D) { return true; }
   2278   static bool classofKind(Kind K) { return K == Typedef; }
   2279 };
   2280 
   2281 /// TypeAliasDecl - Represents the declaration of a typedef-name via a C++0x
   2282 /// alias-declaration.
   2283 class TypeAliasDecl : public TypedefNameDecl {
   2284   TypeAliasDecl(DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc,
   2285                 IdentifierInfo *Id, TypeSourceInfo *TInfo)
   2286     : TypedefNameDecl(TypeAlias, DC, StartLoc, IdLoc, Id, TInfo) {}
   2287 
   2288 public:
   2289   static TypeAliasDecl *Create(ASTContext &C, DeclContext *DC,
   2290                                SourceLocation StartLoc, SourceLocation IdLoc,
   2291                                IdentifierInfo *Id, TypeSourceInfo *TInfo);
   2292 
   2293   SourceRange getSourceRange() const;
   2294 
   2295   // Implement isa/cast/dyncast/etc.
   2296   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2297   static bool classof(const TypeAliasDecl *D) { return true; }
   2298   static bool classofKind(Kind K) { return K == TypeAlias; }
   2299 };
   2300 
   2301 /// TagDecl - Represents the declaration of a struct/union/class/enum.
   2302 class TagDecl
   2303   : public TypeDecl, public DeclContext, public Redeclarable<TagDecl> {
   2304 public:
   2305   // This is really ugly.
   2306   typedef TagTypeKind TagKind;
   2307 
   2308 private:
   2309   // FIXME: This can be packed into the bitfields in Decl.
   2310   /// TagDeclKind - The TagKind enum.
   2311   unsigned TagDeclKind : 2;
   2312 
   2313   /// IsDefinition - True if this is a definition ("struct foo {};"), false if
   2314   /// it is a declaration ("struct foo;").
   2315   bool IsDefinition : 1;
   2316 
   2317   /// IsBeingDefined - True if this is currently being defined.
   2318   bool IsBeingDefined : 1;
   2319 
   2320   /// IsEmbeddedInDeclarator - True if this tag declaration is
   2321   /// "embedded" (i.e., defined or declared for the very first time)
   2322   /// in the syntax of a declarator.
   2323   bool IsEmbeddedInDeclarator : 1;
   2324 
   2325 protected:
   2326   // These are used by (and only defined for) EnumDecl.
   2327   unsigned NumPositiveBits : 8;
   2328   unsigned NumNegativeBits : 8;
   2329 
   2330   /// IsScoped - True if this tag declaration is a scoped enumeration. Only
   2331   /// possible in C++0x mode.
   2332   bool IsScoped : 1;
   2333   /// IsScopedUsingClassTag - If this tag declaration is a scoped enum,
   2334   /// then this is true if the scoped enum was declared using the class
   2335   /// tag, false if it was declared with the struct tag. No meaning is
   2336   /// associated if this tag declaration is not a scoped enum.
   2337   bool IsScopedUsingClassTag : 1;
   2338 
   2339   /// IsFixed - True if this is an enumeration with fixed underlying type. Only
   2340   /// possible in C++0x mode.
   2341   bool IsFixed : 1;
   2342 
   2343 private:
   2344   SourceLocation RBraceLoc;
   2345 
   2346   // A struct representing syntactic qualifier info,
   2347   // to be used for the (uncommon) case of out-of-line declarations.
   2348   typedef QualifierInfo ExtInfo;
   2349 
   2350   /// TypedefNameDeclOrQualifier - If the (out-of-line) tag declaration name
   2351   /// is qualified, it points to the qualifier info (nns and range);
   2352   /// otherwise, if the tag declaration is anonymous and it is part of
   2353   /// a typedef or alias, it points to the TypedefNameDecl (used for mangling);
   2354   /// otherwise, it is a null (TypedefNameDecl) pointer.
   2355   llvm::PointerUnion<TypedefNameDecl*, ExtInfo*> TypedefNameDeclOrQualifier;
   2356 
   2357   bool hasExtInfo() const { return TypedefNameDeclOrQualifier.is<ExtInfo*>(); }
   2358   ExtInfo *getExtInfo() { return TypedefNameDeclOrQualifier.get<ExtInfo*>(); }
   2359   const ExtInfo *getExtInfo() const {
   2360     return TypedefNameDeclOrQualifier.get<ExtInfo*>();
   2361   }
   2362 
   2363 protected:
   2364   TagDecl(Kind DK, TagKind TK, DeclContext *DC,
   2365           SourceLocation L, IdentifierInfo *Id,
   2366           TagDecl *PrevDecl, SourceLocation StartL)
   2367     : TypeDecl(DK, DC, L, Id, StartL), DeclContext(DK),
   2368       TypedefNameDeclOrQualifier((TypedefNameDecl*) 0) {
   2369     assert((DK != Enum || TK == TTK_Enum) &&
   2370            "EnumDecl not matched with TTK_Enum");
   2371     TagDeclKind = TK;
   2372     IsDefinition = false;
   2373     IsBeingDefined = false;
   2374     IsEmbeddedInDeclarator = false;
   2375     setPreviousDeclaration(PrevDecl);
   2376   }
   2377 
   2378   typedef Redeclarable<TagDecl> redeclarable_base;
   2379   virtual TagDecl *getNextRedeclaration() { return RedeclLink.getNext(); }
   2380 
   2381   /// @brief Completes the definition of this tag declaration.
   2382   ///
   2383   /// This is a helper function for derived classes.
   2384   void completeDefinition();
   2385 
   2386 public:
   2387   typedef redeclarable_base::redecl_iterator redecl_iterator;
   2388   redecl_iterator redecls_begin() const {
   2389     return redeclarable_base::redecls_begin();
   2390   }
   2391   redecl_iterator redecls_end() const {
   2392     return redeclarable_base::redecls_end();
   2393   }
   2394 
   2395   SourceLocation getRBraceLoc() const { return RBraceLoc; }
   2396   void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
   2397 
   2398   /// getInnerLocStart - Return SourceLocation representing start of source
   2399   /// range ignoring outer template declarations.
   2400   SourceLocation getInnerLocStart() const { return getLocStart(); }
   2401 
   2402   /// getOuterLocStart - Return SourceLocation representing start of source
   2403   /// range taking into account any outer template declarations.
   2404   SourceLocation getOuterLocStart() const;
   2405   virtual SourceRange getSourceRange() const;
   2406 
   2407   virtual TagDecl* getCanonicalDecl();
   2408   const TagDecl* getCanonicalDecl() const {
   2409     return const_cast<TagDecl*>(this)->getCanonicalDecl();
   2410   }
   2411 
   2412   /// isThisDeclarationADefinition() - Return true if this declaration
   2413   /// defines the type.  Provided for consistency.
   2414   bool isThisDeclarationADefinition() const {
   2415     return isDefinition();
   2416   }
   2417 
   2418   /// isDefinition - Return true if this decl has its body specified.
   2419   bool isDefinition() const {
   2420     return IsDefinition;
   2421   }
   2422 
   2423   /// isBeingDefined - Return true if this decl is currently being defined.
   2424   bool isBeingDefined() const {
   2425     return IsBeingDefined;
   2426   }
   2427 
   2428   bool isEmbeddedInDeclarator() const {
   2429     return IsEmbeddedInDeclarator;
   2430   }
   2431   void setEmbeddedInDeclarator(bool isInDeclarator) {
   2432     IsEmbeddedInDeclarator = isInDeclarator;
   2433   }
   2434 
   2435   /// \brief Whether this declaration declares a type that is
   2436   /// dependent, i.e., a type that somehow depends on template
   2437   /// parameters.
   2438   bool isDependentType() const { return isDependentContext(); }
   2439 
   2440   /// @brief Starts the definition of this tag declaration.
   2441   ///
   2442   /// This method should be invoked at the beginning of the definition
   2443   /// of this tag declaration. It will set the tag type into a state
   2444   /// where it is in the process of being defined.
   2445   void startDefinition();
   2446 
   2447   /// getDefinition - Returns the TagDecl that actually defines this
   2448   ///  struct/union/class/enum.  When determining whether or not a
   2449   ///  struct/union/class/enum is completely defined, one should use this method
   2450   ///  as opposed to 'isDefinition'.  'isDefinition' indicates whether or not a
   2451   ///  specific TagDecl is defining declaration, not whether or not the
   2452   ///  struct/union/class/enum type is defined.  This method returns NULL if
   2453   ///  there is no TagDecl that defines the struct/union/class/enum.
   2454   TagDecl* getDefinition() const;
   2455 
   2456   void setDefinition(bool V) { IsDefinition = V; }
   2457 
   2458   const char *getKindName() const {
   2459     return TypeWithKeyword::getTagTypeKindName(getTagKind());
   2460   }
   2461 
   2462   TagKind getTagKind() const {
   2463     return TagKind(TagDeclKind);
   2464   }
   2465 
   2466   void setTagKind(TagKind TK) { TagDeclKind = TK; }
   2467 
   2468   bool isStruct() const { return getTagKind() == TTK_Struct; }
   2469   bool isClass()  const { return getTagKind() == TTK_Class; }
   2470   bool isUnion()  const { return getTagKind() == TTK_Union; }
   2471   bool isEnum()   const { return getTagKind() == TTK_Enum; }
   2472 
   2473   TypedefNameDecl *getTypedefNameForAnonDecl() const {
   2474     return hasExtInfo() ? 0 : TypedefNameDeclOrQualifier.get<TypedefNameDecl*>();
   2475   }
   2476 
   2477   void setTypedefNameForAnonDecl(TypedefNameDecl *TDD);
   2478 
   2479   /// \brief Retrieve the nested-name-specifier that qualifies the name of this
   2480   /// declaration, if it was present in the source.
   2481   NestedNameSpecifier *getQualifier() const {
   2482     return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
   2483                         : 0;
   2484   }
   2485 
   2486   /// \brief Retrieve the nested-name-specifier (with source-location
   2487   /// information) that qualifies the name of this declaration, if it was
   2488   /// present in the source.
   2489   NestedNameSpecifierLoc getQualifierLoc() const {
   2490     return hasExtInfo() ? getExtInfo()->QualifierLoc
   2491                         : NestedNameSpecifierLoc();
   2492   }
   2493 
   2494   void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc);
   2495 
   2496   unsigned getNumTemplateParameterLists() const {
   2497     return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
   2498   }
   2499   TemplateParameterList *getTemplateParameterList(unsigned i) const {
   2500     assert(i < getNumTemplateParameterLists());
   2501     return getExtInfo()->TemplParamLists[i];
   2502   }
   2503   void setTemplateParameterListsInfo(ASTContext &Context, unsigned NumTPLists,
   2504                                      TemplateParameterList **TPLists);
   2505 
   2506   // Implement isa/cast/dyncast/etc.
   2507   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2508   static bool classof(const TagDecl *D) { return true; }
   2509   static bool classofKind(Kind K) { return K >= firstTag && K <= lastTag; }
   2510 
   2511   static DeclContext *castToDeclContext(const TagDecl *D) {
   2512     return static_cast<DeclContext *>(const_cast<TagDecl*>(D));
   2513   }
   2514   static TagDecl *castFromDeclContext(const DeclContext *DC) {
   2515     return static_cast<TagDecl *>(const_cast<DeclContext*>(DC));
   2516   }
   2517 
   2518   friend class ASTDeclReader;
   2519   friend class ASTDeclWriter;
   2520 };
   2521 
   2522 /// EnumDecl - Represents an enum.  As an extension, we allow forward-declared
   2523 /// enums.
   2524 class EnumDecl : public TagDecl {
   2525   /// IntegerType - This represent the integer type that the enum corresponds
   2526   /// to for code generation purposes.  Note that the enumerator constants may
   2527   /// have a different type than this does.
   2528   ///
   2529   /// If the underlying integer type was explicitly stated in the source
   2530   /// code, this is a TypeSourceInfo* for that type. Otherwise this type
   2531   /// was automatically deduced somehow, and this is a Type*.
   2532   ///
   2533   /// Normally if IsFixed(), this would contain a TypeSourceInfo*, but in
   2534   /// some cases it won't.
   2535   ///
   2536   /// The underlying type of an enumeration never has any qualifiers, so
   2537   /// we can get away with just storing a raw Type*, and thus save an
   2538   /// extra pointer when TypeSourceInfo is needed.
   2539 
   2540   llvm::PointerUnion<const Type*, TypeSourceInfo*> IntegerType;
   2541 
   2542   /// PromotionType - The integer type that values of this type should
   2543   /// promote to.  In C, enumerators are generally of an integer type
   2544   /// directly, but gcc-style large enumerators (and all enumerators
   2545   /// in C++) are of the enum type instead.
   2546   QualType PromotionType;
   2547 
   2548   /// \brief If the enumeration was instantiated from an enumeration
   2549   /// within a class or function template, this pointer refers to the
   2550   /// enumeration declared within the template.
   2551   EnumDecl *InstantiatedFrom;
   2552 
   2553   // The number of positive and negative bits required by the
   2554   // enumerators are stored in the SubclassBits field.
   2555   enum {
   2556     NumBitsWidth = 8,
   2557     NumBitsMask = (1 << NumBitsWidth) - 1
   2558   };
   2559 
   2560   EnumDecl(DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc,
   2561            IdentifierInfo *Id, EnumDecl *PrevDecl,
   2562            bool Scoped, bool ScopedUsingClassTag, bool Fixed)
   2563     : TagDecl(Enum, TTK_Enum, DC, IdLoc, Id, PrevDecl, StartLoc),
   2564       InstantiatedFrom(0) {
   2565     assert(Scoped || !ScopedUsingClassTag);
   2566     IntegerType = (const Type*)0;
   2567     NumNegativeBits = 0;
   2568     NumPositiveBits = 0;
   2569     IsScoped = Scoped;
   2570     IsScopedUsingClassTag = ScopedUsingClassTag;
   2571     IsFixed = Fixed;
   2572   }
   2573 public:
   2574   EnumDecl *getCanonicalDecl() {
   2575     return cast<EnumDecl>(TagDecl::getCanonicalDecl());
   2576   }
   2577   const EnumDecl *getCanonicalDecl() const {
   2578     return cast<EnumDecl>(TagDecl::getCanonicalDecl());
   2579   }
   2580 
   2581   const EnumDecl *getPreviousDeclaration() const {
   2582     return cast_or_null<EnumDecl>(TagDecl::getPreviousDeclaration());
   2583   }
   2584   EnumDecl *getPreviousDeclaration() {
   2585     return cast_or_null<EnumDecl>(TagDecl::getPreviousDeclaration());
   2586   }
   2587 
   2588   static EnumDecl *Create(ASTContext &C, DeclContext *DC,
   2589                           SourceLocation StartLoc, SourceLocation IdLoc,
   2590                           IdentifierInfo *Id, EnumDecl *PrevDecl,
   2591                           bool IsScoped, bool IsScopedUsingClassTag,
   2592                           bool IsFixed);
   2593   static EnumDecl *Create(ASTContext &C, EmptyShell Empty);
   2594 
   2595   /// completeDefinition - When created, the EnumDecl corresponds to a
   2596   /// forward-declared enum. This method is used to mark the
   2597   /// declaration as being defined; it's enumerators have already been
   2598   /// added (via DeclContext::addDecl). NewType is the new underlying
   2599   /// type of the enumeration type.
   2600   void completeDefinition(QualType NewType,
   2601                           QualType PromotionType,
   2602                           unsigned NumPositiveBits,
   2603                           unsigned NumNegativeBits);
   2604 
   2605   // enumerator_iterator - Iterates through the enumerators of this
   2606   // enumeration.
   2607   typedef specific_decl_iterator<EnumConstantDecl> enumerator_iterator;
   2608 
   2609   enumerator_iterator enumerator_begin() const {
   2610     const EnumDecl *E = cast_or_null<EnumDecl>(getDefinition());
   2611     if (!E)
   2612       E = this;
   2613     return enumerator_iterator(E->decls_begin());
   2614   }
   2615 
   2616   enumerator_iterator enumerator_end() const {
   2617     const EnumDecl *E = cast_or_null<EnumDecl>(getDefinition());
   2618     if (!E)
   2619       E = this;
   2620     return enumerator_iterator(E->decls_end());
   2621   }
   2622 
   2623   /// getPromotionType - Return the integer type that enumerators
   2624   /// should promote to.
   2625   QualType getPromotionType() const { return PromotionType; }
   2626 
   2627   /// \brief Set the promotion type.
   2628   void setPromotionType(QualType T) { PromotionType = T; }
   2629 
   2630   /// getIntegerType - Return the integer type this enum decl corresponds to.
   2631   /// This returns a null qualtype for an enum forward definition.
   2632   QualType getIntegerType() const {
   2633     if (!IntegerType)
   2634       return QualType();
   2635     if (const Type* T = IntegerType.dyn_cast<const Type*>())
   2636       return QualType(T, 0);
   2637     return IntegerType.get<TypeSourceInfo*>()->getType();
   2638   }
   2639 
   2640   /// \brief Set the underlying integer type.
   2641   void setIntegerType(QualType T) { IntegerType = T.getTypePtrOrNull(); }
   2642 
   2643   /// \brief Set the underlying integer type source info.
   2644   void setIntegerTypeSourceInfo(TypeSourceInfo* TInfo) { IntegerType = TInfo; }
   2645 
   2646   /// \brief Return the type source info for the underlying integer type,
   2647   /// if no type source info exists, return 0.
   2648   TypeSourceInfo* getIntegerTypeSourceInfo() const {
   2649     return IntegerType.dyn_cast<TypeSourceInfo*>();
   2650   }
   2651 
   2652   /// \brief Returns the width in bits required to store all the
   2653   /// non-negative enumerators of this enum.
   2654   unsigned getNumPositiveBits() const {
   2655     return NumPositiveBits;
   2656   }
   2657   void setNumPositiveBits(unsigned Num) {
   2658     NumPositiveBits = Num;
   2659     assert(NumPositiveBits == Num && "can't store this bitcount");
   2660   }
   2661 
   2662   /// \brief Returns the width in bits required to store all the
   2663   /// negative enumerators of this enum.  These widths include
   2664   /// the rightmost leading 1;  that is:
   2665   ///
   2666   /// MOST NEGATIVE ENUMERATOR     PATTERN     NUM NEGATIVE BITS
   2667   /// ------------------------     -------     -----------------
   2668   ///                       -1     1111111                     1
   2669   ///                      -10     1110110                     5
   2670   ///                     -101     1001011                     8
   2671   unsigned getNumNegativeBits() const {
   2672     return NumNegativeBits;
   2673   }
   2674   void setNumNegativeBits(unsigned Num) {
   2675     NumNegativeBits = Num;
   2676   }
   2677 
   2678   /// \brief Returns true if this is a C++0x scoped enumeration.
   2679   bool isScoped() const {
   2680     return IsScoped;
   2681   }
   2682 
   2683   /// \brief Returns true if this is a C++0x scoped enumeration.
   2684   bool isScopedUsingClassTag() const {
   2685     return IsScopedUsingClassTag;
   2686   }
   2687 
   2688   /// \brief Returns true if this is a C++0x enumeration with fixed underlying
   2689   /// type.
   2690   bool isFixed() const {
   2691     return IsFixed;
   2692   }
   2693 
   2694   /// \brief Returns true if this can be considered a complete type.
   2695   bool isComplete() const {
   2696     return isDefinition() || isFixed();
   2697   }
   2698 
   2699   /// \brief Returns the enumeration (declared within the template)
   2700   /// from which this enumeration type was instantiated, or NULL if
   2701   /// this enumeration was not instantiated from any template.
   2702   EnumDecl *getInstantiatedFromMemberEnum() const {
   2703     return InstantiatedFrom;
   2704   }
   2705 
   2706   void setInstantiationOfMemberEnum(EnumDecl *IF) { InstantiatedFrom = IF; }
   2707 
   2708   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2709   static bool classof(const EnumDecl *D) { return true; }
   2710   static bool classofKind(Kind K) { return K == Enum; }
   2711 
   2712   friend class ASTDeclReader;
   2713 };
   2714 
   2715 
   2716 /// RecordDecl - Represents a struct/union/class.  For example:
   2717 ///   struct X;                  // Forward declaration, no "body".
   2718 ///   union Y { int A, B; };     // Has body with members A and B (FieldDecls).
   2719 /// This decl will be marked invalid if *any* members are invalid.
   2720 ///
   2721 class RecordDecl : public TagDecl {
   2722   // FIXME: This can be packed into the bitfields in Decl.
   2723   /// HasFlexibleArrayMember - This is true if this struct ends with a flexible
   2724   /// array member (e.g. int X[]) or if this union contains a struct that does.
   2725   /// If so, this cannot be contained in arrays or other structs as a member.
   2726   bool HasFlexibleArrayMember : 1;
   2727 
   2728   /// AnonymousStructOrUnion - Whether this is the type of an anonymous struct
   2729   /// or union.
   2730   bool AnonymousStructOrUnion : 1;
   2731 
   2732   /// HasObjectMember - This is true if this struct has at least one member
   2733   /// containing an object.
   2734   bool HasObjectMember : 1;
   2735 
   2736   /// \brief Whether the field declarations of this record have been loaded
   2737   /// from external storage. To avoid unnecessary deserialization of
   2738   /// methods/nested types we allow deserialization of just the fields
   2739   /// when needed.
   2740   mutable bool LoadedFieldsFromExternalStorage : 1;
   2741   friend class DeclContext;
   2742 
   2743 protected:
   2744   RecordDecl(Kind DK, TagKind TK, DeclContext *DC,
   2745              SourceLocation StartLoc, SourceLocation IdLoc,
   2746              IdentifierInfo *Id, RecordDecl *PrevDecl);
   2747 
   2748 public:
   2749   static RecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
   2750                             SourceLocation StartLoc, SourceLocation IdLoc,
   2751                             IdentifierInfo *Id, RecordDecl* PrevDecl = 0);
   2752   static RecordDecl *Create(const ASTContext &C, EmptyShell Empty);
   2753 
   2754   const RecordDecl *getPreviousDeclaration() const {
   2755     return cast_or_null<RecordDecl>(TagDecl::getPreviousDeclaration());
   2756   }
   2757   RecordDecl *getPreviousDeclaration() {
   2758     return cast_or_null<RecordDecl>(TagDecl::getPreviousDeclaration());
   2759   }
   2760 
   2761   bool hasFlexibleArrayMember() const { return HasFlexibleArrayMember; }
   2762   void setHasFlexibleArrayMember(bool V) { HasFlexibleArrayMember = V; }
   2763 
   2764   /// isAnonymousStructOrUnion - Whether this is an anonymous struct
   2765   /// or union. To be an anonymous struct or union, it must have been
   2766   /// declared without a name and there must be no objects of this
   2767   /// type declared, e.g.,
   2768   /// @code
   2769   ///   union { int i; float f; };
   2770   /// @endcode
   2771   /// is an anonymous union but neither of the following are:
   2772   /// @code
   2773   ///  union X { int i; float f; };
   2774   ///  union { int i; float f; } obj;
   2775   /// @endcode
   2776   bool isAnonymousStructOrUnion() const { return AnonymousStructOrUnion; }
   2777   void setAnonymousStructOrUnion(bool Anon) {
   2778     AnonymousStructOrUnion = Anon;
   2779   }
   2780 
   2781   bool hasObjectMember() const { return HasObjectMember; }
   2782   void setHasObjectMember (bool val) { HasObjectMember = val; }
   2783 
   2784   /// \brief Determines whether this declaration represents the
   2785   /// injected class name.
   2786   ///
   2787   /// The injected class name in C++ is the name of the class that
   2788   /// appears inside the class itself. For example:
   2789   ///
   2790   /// \code
   2791   /// struct C {
   2792   ///   // C is implicitly declared here as a synonym for the class name.
   2793   /// };
   2794   ///
   2795   /// C::C c; // same as "C c;"
   2796   /// \endcode
   2797   bool isInjectedClassName() const;
   2798 
   2799   /// getDefinition - Returns the RecordDecl that actually defines this
   2800   ///  struct/union/class.  When determining whether or not a struct/union/class
   2801   ///  is completely defined, one should use this method as opposed to
   2802   ///  'isDefinition'.  'isDefinition' indicates whether or not a specific
   2803   ///  RecordDecl is defining declaration, not whether or not the record
   2804   ///  type is defined.  This method returns NULL if there is no RecordDecl
   2805   ///  that defines the struct/union/tag.
   2806   RecordDecl* getDefinition() const {
   2807     return cast_or_null<RecordDecl>(TagDecl::getDefinition());
   2808   }
   2809 
   2810   // Iterator access to field members. The field iterator only visits
   2811   // the non-static data members of this class, ignoring any static
   2812   // data members, functions, constructors, destructors, etc.
   2813   typedef specific_decl_iterator<FieldDecl> field_iterator;
   2814 
   2815   field_iterator field_begin() const;
   2816 
   2817   field_iterator field_end() const {
   2818     return field_iterator(decl_iterator());
   2819   }
   2820 
   2821   // field_empty - Whether there are any fields (non-static data
   2822   // members) in this record.
   2823   bool field_empty() const {
   2824     return field_begin() == field_end();
   2825   }
   2826 
   2827   /// completeDefinition - Notes that the definition of this type is
   2828   /// now complete.
   2829   virtual void completeDefinition();
   2830 
   2831   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2832   static bool classof(const RecordDecl *D) { return true; }
   2833   static bool classofKind(Kind K) {
   2834     return K >= firstRecord && K <= lastRecord;
   2835   }
   2836 
   2837 private:
   2838   /// \brief Deserialize just the fields.
   2839   void LoadFieldsFromExternalStorage() const;
   2840 };
   2841 
   2842 class FileScopeAsmDecl : public Decl {
   2843   StringLiteral *AsmString;
   2844   SourceLocation RParenLoc;
   2845   FileScopeAsmDecl(DeclContext *DC, StringLiteral *asmstring,
   2846                    SourceLocation StartL, SourceLocation EndL)
   2847     : Decl(FileScopeAsm, DC, StartL), AsmString(asmstring), RParenLoc(EndL) {}
   2848 public:
   2849   static FileScopeAsmDecl *Create(ASTContext &C, DeclContext *DC,
   2850                                   StringLiteral *Str, SourceLocation AsmLoc,
   2851                                   SourceLocation RParenLoc);
   2852 
   2853   SourceLocation getAsmLoc() const { return getLocation(); }
   2854   SourceLocation getRParenLoc() const { return RParenLoc; }
   2855   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
   2856   SourceRange getSourceRange() const {
   2857     return SourceRange(getAsmLoc(), getRParenLoc());
   2858   }
   2859 
   2860   const StringLiteral *getAsmString() const { return AsmString; }
   2861   StringLiteral *getAsmString() { return AsmString; }
   2862   void setAsmString(StringLiteral *Asm) { AsmString = Asm; }
   2863 
   2864   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   2865   static bool classof(const FileScopeAsmDecl *D) { return true; }
   2866   static bool classofKind(Kind K) { return K == FileScopeAsm; }
   2867 };
   2868 
   2869 /// BlockDecl - This represents a block literal declaration, which is like an
   2870 /// unnamed FunctionDecl.  For example:
   2871 /// ^{ statement-body }   or   ^(int arg1, float arg2){ statement-body }
   2872 ///
   2873 class BlockDecl : public Decl, public DeclContext {
   2874 public:
   2875   /// A class which contains all the information about a particular
   2876   /// captured value.
   2877   class Capture {
   2878     enum {
   2879       flag_isByRef = 0x1,
   2880       flag_isNested = 0x2
   2881     };
   2882 
   2883     /// The variable being captured.
   2884     llvm::PointerIntPair<VarDecl*, 2> VariableAndFlags;
   2885 
   2886     /// The copy expression, expressed in terms of a DeclRef (or
   2887     /// BlockDeclRef) to the captured variable.  Only required if the
   2888     /// variable has a C++ class type.
   2889     Expr *CopyExpr;
   2890 
   2891   public:
   2892     Capture(VarDecl *variable, bool byRef, bool nested, Expr *copy)
   2893       : VariableAndFlags(variable,
   2894                   (byRef ? flag_isByRef : 0) | (nested ? flag_isNested : 0)),
   2895         CopyExpr(copy) {}
   2896 
   2897     /// The variable being captured.
   2898     VarDecl *getVariable() const { return VariableAndFlags.getPointer(); }
   2899 
   2900     /// Whether this is a "by ref" capture, i.e. a capture of a __block
   2901     /// variable.
   2902     bool isByRef() const { return VariableAndFlags.getInt() & flag_isByRef; }
   2903 
   2904     /// Whether this is a nested capture, i.e. the variable captured
   2905     /// is not from outside the immediately enclosing function/block.
   2906     bool isNested() const { return VariableAndFlags.getInt() & flag_isNested; }
   2907 
   2908     bool hasCopyExpr() const { return CopyExpr != 0; }
   2909     Expr *getCopyExpr() const { return CopyExpr; }
   2910     void setCopyExpr(Expr *e) { CopyExpr = e; }
   2911   };
   2912 
   2913 private:
   2914   // FIXME: This can be packed into the bitfields in Decl.
   2915   bool IsVariadic : 1;
   2916   bool CapturesCXXThis : 1;
   2917   /// ParamInfo - new[]'d array of pointers to ParmVarDecls for the formal
   2918   /// parameters of this function.  This is null if a prototype or if there are
   2919   /// no formals.
   2920   ParmVarDecl **ParamInfo;
   2921   unsigned NumParams;
   2922 
   2923   Stmt *Body;
   2924   TypeSourceInfo *SignatureAsWritten;
   2925 
   2926   Capture *Captures;
   2927   unsigned NumCaptures;
   2928 
   2929 protected:
   2930   BlockDecl(DeclContext *DC, SourceLocation CaretLoc)
   2931     : Decl(Block, DC, CaretLoc), DeclContext(Block),
   2932       IsVariadic(false), CapturesCXXThis(false),
   2933       ParamInfo(0), NumParams(0), Body(0),
   2934       SignatureAsWritten(0), Captures(0), NumCaptures(0) {}
   2935 
   2936 public:
   2937   static BlockDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L);
   2938 
   2939   SourceLocation getCaretLocation() const { return getLocation(); }
   2940 
   2941   bool isVariadic() const { return IsVariadic; }
   2942   void setIsVariadic(bool value) { IsVariadic = value; }
   2943 
   2944   CompoundStmt *getCompoundBody() const { return (CompoundStmt*) Body; }
   2945   Stmt *getBody() const { return (Stmt*) Body; }
   2946   void setBody(CompoundStmt *B) { Body = (Stmt*) B; }
   2947 
   2948   void setSignatureAsWritten(TypeSourceInfo *Sig) { SignatureAsWritten = Sig; }
   2949   TypeSourceInfo *getSignatureAsWritten() const { return SignatureAsWritten; }
   2950 
   2951   // Iterator access to formal parameters.
   2952   unsigned param_size() const { return getNumParams(); }
   2953   typedef ParmVarDecl **param_iterator;
   2954   typedef ParmVarDecl * const *param_const_iterator;
   2955 
   2956   bool param_empty() const { return NumParams == 0; }
   2957   param_iterator param_begin()  { return ParamInfo; }
   2958   param_iterator param_end()   { return ParamInfo+param_size(); }
   2959 
   2960   param_const_iterator param_begin() const { return ParamInfo; }
   2961   param_const_iterator param_end() const   { return ParamInfo+param_size(); }
   2962 
   2963   unsigned getNumParams() const { return NumParams; }
   2964   const ParmVarDecl *getParamDecl(unsigned i) const {
   2965     assert(i < getNumParams() && "Illegal param #");
   2966     return ParamInfo[i];
   2967   }
   2968   ParmVarDecl *getParamDecl(unsigned i) {
   2969     assert(i < getNumParams() && "Illegal param #");
   2970     return ParamInfo[i];
   2971   }
   2972   void setParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
   2973 
   2974   /// hasCaptures - True if this block (or its nested blocks) captures
   2975   /// anything of local storage from its enclosing scopes.
   2976   bool hasCaptures() const { return NumCaptures != 0 || CapturesCXXThis; }
   2977 
   2978   /// getNumCaptures - Returns the number of captured variables.
   2979   /// Does not include an entry for 'this'.
   2980   unsigned getNumCaptures() const { return NumCaptures; }
   2981 
   2982   typedef const Capture *capture_iterator;
   2983   typedef const Capture *capture_const_iterator;
   2984   capture_iterator capture_begin() { return Captures; }
   2985   capture_iterator capture_end() { return Captures + NumCaptures; }
   2986   capture_const_iterator capture_begin() const { return Captures; }
   2987   capture_const_iterator capture_end() const { return Captures + NumCaptures; }
   2988 
   2989   bool capturesCXXThis() const { return CapturesCXXThis; }
   2990 
   2991   bool capturesVariable(const VarDecl *var) const;
   2992 
   2993   void setCaptures(ASTContext &Context,
   2994                    const Capture *begin,
   2995                    const Capture *end,
   2996                    bool capturesCXXThis);
   2997 
   2998   virtual SourceRange getSourceRange() const;
   2999 
   3000   // Implement isa/cast/dyncast/etc.
   3001   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   3002   static bool classof(const BlockDecl *D) { return true; }
   3003   static bool classofKind(Kind K) { return K == Block; }
   3004   static DeclContext *castToDeclContext(const BlockDecl *D) {
   3005     return static_cast<DeclContext *>(const_cast<BlockDecl*>(D));
   3006   }
   3007   static BlockDecl *castFromDeclContext(const DeclContext *DC) {
   3008     return static_cast<BlockDecl *>(const_cast<DeclContext*>(DC));
   3009   }
   3010 };
   3011 
   3012 /// Insertion operator for diagnostics.  This allows sending NamedDecl's
   3013 /// into a diagnostic with <<.
   3014 inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
   3015                                            NamedDecl* ND) {
   3016   DB.AddTaggedVal(reinterpret_cast<intptr_t>(ND), Diagnostic::ak_nameddecl);
   3017   return DB;
   3018 }
   3019 
   3020 template<typename decl_type>
   3021 void Redeclarable<decl_type>::setPreviousDeclaration(decl_type *PrevDecl) {
   3022   // Note: This routine is implemented here because we need both NamedDecl
   3023   // and Redeclarable to be defined.
   3024 
   3025   decl_type *First;
   3026 
   3027   if (PrevDecl) {
   3028     // Point to previous. Make sure that this is actually the most recent
   3029     // redeclaration, or we can build invalid chains. If the most recent
   3030     // redeclaration is invalid, it won't be PrevDecl, but we want it anyway.
   3031     RedeclLink = PreviousDeclLink(llvm::cast<decl_type>(
   3032                                                         PrevDecl->getMostRecentDeclaration()));
   3033     First = PrevDecl->getFirstDeclaration();
   3034     assert(First->RedeclLink.NextIsLatest() && "Expected first");
   3035   } else {
   3036     // Make this first.
   3037     First = static_cast<decl_type*>(this);
   3038   }
   3039 
   3040   // First one will point to this one as latest.
   3041   First->RedeclLink = LatestDeclLink(static_cast<decl_type*>(this));
   3042   if (NamedDecl *ND = dyn_cast<NamedDecl>(static_cast<decl_type*>(this)))
   3043     ND->ClearLinkageCache();
   3044 }
   3045 
   3046 }  // end namespace clang
   3047 
   3048 #endif
   3049