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