Decl.h revision 686775deca8b8685eb90801495880e3abdd844c2
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
25namespace clang {
26class CXXTemporary;
27class Expr;
28class FunctionTemplateDecl;
29class Stmt;
30class CompoundStmt;
31class StringLiteral;
32class NestedNameSpecifier;
33class TemplateParameterList;
34class TemplateArgumentList;
35class MemberSpecializationInfo;
36class FunctionTemplateSpecializationInfo;
37class DependentFunctionTemplateSpecializationInfo;
38class TypeLoc;
39class UnresolvedSetImpl;
40class 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///
51class 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) { }
57public:
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.
66class 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) {}
77public:
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.
98class 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
104protected:
105  NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
106    : Decl(DK, DC, L), Name(N) { }
107
108public:
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  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
297inline 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.
308class 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
319public:
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.
343class 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
383public:
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.
486class ValueDecl : public NamedDecl {
487  QualType DeclType;
488
489protected:
490  ValueDecl(Kind DK, DeclContext *DC, SourceLocation L,
491            DeclarationName N, QualType T)
492    : NamedDecl(DK, DC, L, N), DeclType(T) {}
493public:
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.
505struct 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
530private:
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.
538class 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
555protected:
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
562public:
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).
629struct 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.
657class VarDecl : public DeclaratorDecl, public Redeclarable<VarDecl> {
658public:
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
667protected:
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
684private:
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
715protected:
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
765public:
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
1156class ImplicitParamDecl : public VarDecl {
1157public:
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.
1176class ParmVarDecl : public VarDecl {
1177public:
1178  enum { MaxFunctionScopeDepth = 255 };
1179  enum { MaxFunctionScopeIndex = 255 };
1180
1181protected:
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
1193public:
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.
1359class FunctionDecl : public DeclaratorDecl, public DeclContext,
1360                     public Redeclarable<FunctionDecl> {
1361public:
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
1373private:
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
1465protected:
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
1487public:
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.
1978class 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;
1993protected:
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
2004public:
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.
2094class EnumConstantDecl : public ValueDecl {
2095  Stmt *Init; // an integer constant expression
2096  llvm::APSInt Val; // The value.
2097protected:
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
2103public:
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.
2130class 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
2139public:
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///
2169class 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
2183protected:
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
2188public:
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.
2210class TypedefNameDecl : public TypeDecl, public Redeclarable<TypedefNameDecl> {
2211  /// UnderlyingType - This is the type the typedef is set to.
2212  TypeSourceInfo *TInfo;
2213
2214protected:
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
2225public:
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.
2263class 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
2268public:
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.
2283class 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
2288public:
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.
2302class TagDecl
2303  : public TypeDecl, public DeclContext, public Redeclarable<TagDecl> {
2304public:
2305  // This is really ugly.
2306  typedef TagTypeKind TagKind;
2307
2308private:
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
2325protected:
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
2343private:
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
2363protected:
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
2386public:
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.
2524class 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  }
2573public:
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///
2721class 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
2743protected:
2744  RecordDecl(Kind DK, TagKind TK, DeclContext *DC,
2745             SourceLocation StartLoc, SourceLocation IdLoc,
2746             IdentifierInfo *Id, RecordDecl *PrevDecl);
2747
2748public:
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
2837private:
2838  /// \brief Deserialize just the fields.
2839  void LoadFieldsFromExternalStorage() const;
2840};
2841
2842class 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) {}
2848public:
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///
2873class BlockDecl : public Decl, public DeclContext {
2874public:
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
2913private:
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
2929protected:
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
2936public:
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 <<.
3014inline 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
3020template<typename decl_type>
3021void 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