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