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