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