clang 19.0.0git
DeclBase.h
Go to the documentation of this file.
1//===- DeclBase.h - Base Classes for representing declarations --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Decl and DeclContext interfaces.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_DECLBASE_H
14#define LLVM_CLANG_AST_DECLBASE_H
15
18#include "clang/AST/DeclID.h"
22#include "clang/Basic/LLVM.h"
26#include "llvm/ADT/ArrayRef.h"
27#include "llvm/ADT/PointerIntPair.h"
28#include "llvm/ADT/PointerUnion.h"
29#include "llvm/ADT/iterator.h"
30#include "llvm/ADT/iterator_range.h"
31#include "llvm/Support/Casting.h"
32#include "llvm/Support/Compiler.h"
33#include "llvm/Support/PrettyStackTrace.h"
34#include "llvm/Support/VersionTuple.h"
35#include <algorithm>
36#include <cassert>
37#include <cstddef>
38#include <iterator>
39#include <string>
40#include <type_traits>
41#include <utility>
42
43namespace clang {
44
45class ASTContext;
46class ASTMutationListener;
47class Attr;
48class BlockDecl;
49class DeclContext;
50class ExternalSourceSymbolAttr;
51class FunctionDecl;
52class FunctionType;
53class IdentifierInfo;
54enum class Linkage : unsigned char;
55class LinkageSpecDecl;
56class Module;
57class NamedDecl;
58class ObjCContainerDecl;
59class ObjCMethodDecl;
60struct PrintingPolicy;
61class RecordDecl;
62class SourceManager;
63class Stmt;
64class StoredDeclsMap;
65class TemplateDecl;
66class TemplateParameterList;
67class TranslationUnitDecl;
68class UsingDirectiveDecl;
69
70/// Captures the result of checking the availability of a
71/// declaration.
77};
78
79/// Decl - This represents one declaration (or definition), e.g. a variable,
80/// typedef, function, struct, etc.
81///
82/// Note: There are objects tacked on before the *beginning* of Decl
83/// (and its subclasses) in its Decl::operator new(). Proper alignment
84/// of all subclasses (not requiring more than the alignment of Decl) is
85/// asserted in DeclBase.cpp.
86class alignas(8) Decl {
87public:
88 /// Lists the kind of concrete classes of Decl.
89 enum Kind {
90#define DECL(DERIVED, BASE) DERIVED,
91#define ABSTRACT_DECL(DECL)
92#define DECL_RANGE(BASE, START, END) \
93 first##BASE = START, last##BASE = END,
94#define LAST_DECL_RANGE(BASE, START, END) \
95 first##BASE = START, last##BASE = END
96#include "clang/AST/DeclNodes.inc"
97 };
98
99 /// A placeholder type used to construct an empty shell of a
100 /// decl-derived type that will be filled in later (e.g., by some
101 /// deserialization method).
102 struct EmptyShell {};
103
104 /// IdentifierNamespace - The different namespaces in which
105 /// declarations may appear. According to C99 6.2.3, there are
106 /// four namespaces, labels, tags, members and ordinary
107 /// identifiers. C++ describes lookup completely differently:
108 /// certain lookups merely "ignore" certain kinds of declarations,
109 /// usually based on whether the declaration is of a type, etc.
110 ///
111 /// These are meant as bitmasks, so that searches in
112 /// C++ can look into the "tag" namespace during ordinary lookup.
113 ///
114 /// Decl currently provides 15 bits of IDNS bits.
116 /// Labels, declared with 'x:' and referenced with 'goto x'.
117 IDNS_Label = 0x0001,
118
119 /// Tags, declared with 'struct foo;' and referenced with
120 /// 'struct foo'. All tags are also types. This is what
121 /// elaborated-type-specifiers look for in C.
122 /// This also contains names that conflict with tags in the
123 /// same scope but that are otherwise ordinary names (non-type
124 /// template parameters and indirect field declarations).
125 IDNS_Tag = 0x0002,
126
127 /// Types, declared with 'struct foo', typedefs, etc.
128 /// This is what elaborated-type-specifiers look for in C++,
129 /// but note that it's ill-formed to find a non-tag.
130 IDNS_Type = 0x0004,
131
132 /// Members, declared with object declarations within tag
133 /// definitions. In C, these can only be found by "qualified"
134 /// lookup in member expressions. In C++, they're found by
135 /// normal lookup.
136 IDNS_Member = 0x0008,
137
138 /// Namespaces, declared with 'namespace foo {}'.
139 /// Lookup for nested-name-specifiers find these.
141
142 /// Ordinary names. In C, everything that's not a label, tag,
143 /// member, or function-local extern ends up here.
145
146 /// Objective C \@protocol.
148
149 /// This declaration is a friend function. A friend function
150 /// declaration is always in this namespace but may also be in
151 /// IDNS_Ordinary if it was previously declared.
153
154 /// This declaration is a friend class. A friend class
155 /// declaration is always in this namespace but may also be in
156 /// IDNS_Tag|IDNS_Type if it was previously declared.
158
159 /// This declaration is a using declaration. A using declaration
160 /// *introduces* a number of other declarations into the current
161 /// scope, and those declarations use the IDNS of their targets,
162 /// but the actual using declarations go in this namespace.
163 IDNS_Using = 0x0200,
164
165 /// This declaration is a C++ operator declared in a non-class
166 /// context. All such operators are also in IDNS_Ordinary.
167 /// C++ lexical operator lookup looks for these.
169
170 /// This declaration is a function-local extern declaration of a
171 /// variable or function. This may also be IDNS_Ordinary if it
172 /// has been declared outside any function. These act mostly like
173 /// invisible friend declarations, but are also visible to unqualified
174 /// lookup within the scope of the declaring function.
176
177 /// This declaration is an OpenMP user defined reduction construction.
179
180 /// This declaration is an OpenMP user defined mapper.
182 };
183
184 /// ObjCDeclQualifier - 'Qualifiers' written next to the return and
185 /// parameter types in method declarations. Other than remembering
186 /// them and mangling them into the method's signature string, these
187 /// are ignored by the compiler; they are consumed by certain
188 /// remote-messaging frameworks.
189 ///
190 /// in, inout, and out are mutually exclusive and apply only to
191 /// method parameters. bycopy and byref are mutually exclusive and
192 /// apply only to method parameters (?). oneway applies only to
193 /// results. All of these expect their corresponding parameter to
194 /// have a particular type. None of this is currently enforced by
195 /// clang.
196 ///
197 /// This should be kept in sync with ObjCDeclSpec::ObjCDeclQualifier.
206
207 /// The nullability qualifier is set when the nullability of the
208 /// result or parameter was expressed via a context-sensitive
209 /// keyword.
211 };
212
213 /// The kind of ownership a declaration has, for visibility purposes.
214 /// This enumeration is designed such that higher values represent higher
215 /// levels of name hiding.
216 enum class ModuleOwnershipKind : unsigned char {
217 /// This declaration is not owned by a module.
218 Unowned,
219
220 /// This declaration has an owning module, but is globally visible
221 /// (typically because its owning module is visible and we know that
222 /// modules cannot later become hidden in this compilation).
223 /// After serialization and deserialization, this will be converted
224 /// to VisibleWhenImported.
225 Visible,
226
227 /// This declaration has an owning module, and is visible when that
228 /// module is imported.
230
231 /// This declaration has an owning module, and is visible to lookups
232 /// that occurs within that module. And it is reachable in other module
233 /// when the owning module is transitively imported.
235
236 /// This declaration has an owning module, but is only visible to
237 /// lookups that occur within that module.
238 /// The discarded declarations in global module fragment belongs
239 /// to this group too.
241 };
242
243protected:
244 /// The next declaration within the same lexical
245 /// DeclContext. These pointers form the linked list that is
246 /// traversed via DeclContext's decls_begin()/decls_end().
247 ///
248 /// The extra three bits are used for the ModuleOwnershipKind.
249 llvm::PointerIntPair<Decl *, 3, ModuleOwnershipKind> NextInContextAndBits;
250
251private:
252 friend class DeclContext;
253
254 struct MultipleDC {
255 DeclContext *SemanticDC;
256 DeclContext *LexicalDC;
257 };
258
259 /// DeclCtx - Holds either a DeclContext* or a MultipleDC*.
260 /// For declarations that don't contain C++ scope specifiers, it contains
261 /// the DeclContext where the Decl was declared.
262 /// For declarations with C++ scope specifiers, it contains a MultipleDC*
263 /// with the context where it semantically belongs (SemanticDC) and the
264 /// context where it was lexically declared (LexicalDC).
265 /// e.g.:
266 ///
267 /// namespace A {
268 /// void f(); // SemanticDC == LexicalDC == 'namespace A'
269 /// }
270 /// void A::f(); // SemanticDC == namespace 'A'
271 /// // LexicalDC == global namespace
272 llvm::PointerUnion<DeclContext*, MultipleDC*> DeclCtx;
273
274 bool isInSemaDC() const { return DeclCtx.is<DeclContext*>(); }
275 bool isOutOfSemaDC() const { return DeclCtx.is<MultipleDC*>(); }
276
277 MultipleDC *getMultipleDC() const {
278 return DeclCtx.get<MultipleDC*>();
279 }
280
281 DeclContext *getSemanticDC() const {
282 return DeclCtx.get<DeclContext*>();
283 }
284
285 /// Loc - The location of this decl.
286 SourceLocation Loc;
287
288 /// DeclKind - This indicates which class this is.
289 LLVM_PREFERRED_TYPE(Kind)
290 unsigned DeclKind : 7;
291
292 /// InvalidDecl - This indicates a semantic error occurred.
293 LLVM_PREFERRED_TYPE(bool)
294 unsigned InvalidDecl : 1;
295
296 /// HasAttrs - This indicates whether the decl has attributes or not.
297 LLVM_PREFERRED_TYPE(bool)
298 unsigned HasAttrs : 1;
299
300 /// Implicit - Whether this declaration was implicitly generated by
301 /// the implementation rather than explicitly written by the user.
302 LLVM_PREFERRED_TYPE(bool)
303 unsigned Implicit : 1;
304
305 /// Whether this declaration was "used", meaning that a definition is
306 /// required.
307 LLVM_PREFERRED_TYPE(bool)
308 unsigned Used : 1;
309
310 /// Whether this declaration was "referenced".
311 /// The difference with 'Used' is whether the reference appears in a
312 /// evaluated context or not, e.g. functions used in uninstantiated templates
313 /// are regarded as "referenced" but not "used".
314 LLVM_PREFERRED_TYPE(bool)
315 unsigned Referenced : 1;
316
317 /// Whether this declaration is a top-level declaration (function,
318 /// global variable, etc.) that is lexically inside an objc container
319 /// definition.
320 LLVM_PREFERRED_TYPE(bool)
321 unsigned TopLevelDeclInObjCContainer : 1;
322
323 /// Whether statistic collection is enabled.
324 static bool StatisticsEnabled;
325
326protected:
327 friend class ASTDeclReader;
328 friend class ASTDeclWriter;
329 friend class ASTNodeImporter;
330 friend class ASTReader;
332 friend class LinkageComputer;
333 friend class RecordDecl;
334 template<typename decl_type> friend class Redeclarable;
335
336 /// Access - Used by C++ decls for the access specifier.
337 // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum
338 LLVM_PREFERRED_TYPE(AccessSpecifier)
340
341 /// Whether this declaration was loaded from an AST file.
342 LLVM_PREFERRED_TYPE(bool)
343 unsigned FromASTFile : 1;
344
345 /// IdentifierNamespace - This specifies what IDNS_* namespace this lives in.
346 LLVM_PREFERRED_TYPE(IdentifierNamespace)
347 unsigned IdentifierNamespace : 14;
348
349 /// If 0, we have not computed the linkage of this declaration.
350 LLVM_PREFERRED_TYPE(Linkage)
351 mutable unsigned CacheValidAndLinkage : 3;
352
353 /// Allocate memory for a deserialized declaration.
354 ///
355 /// This routine must be used to allocate memory for any declaration that is
356 /// deserialized from a module file.
357 ///
358 /// \param Size The size of the allocated object.
359 /// \param Ctx The context in which we will allocate memory.
360 /// \param ID The global ID of the deserialized declaration.
361 /// \param Extra The amount of extra space to allocate after the object.
362 void *operator new(std::size_t Size, const ASTContext &Ctx, GlobalDeclID ID,
363 std::size_t Extra = 0);
364
365 /// Allocate memory for a non-deserialized declaration.
366 void *operator new(std::size_t Size, const ASTContext &Ctx,
367 DeclContext *Parent, std::size_t Extra = 0);
368
369private:
370 bool AccessDeclContextCheck() const;
371
372 /// Get the module ownership kind to use for a local lexical child of \p DC,
373 /// which may be either a local or (rarely) an imported declaration.
374 static ModuleOwnershipKind getModuleOwnershipKindForChildOf(DeclContext *DC) {
375 if (DC) {
376 auto *D = cast<Decl>(DC);
377 auto MOK = D->getModuleOwnershipKind();
378 if (MOK != ModuleOwnershipKind::Unowned &&
379 (!D->isFromASTFile() || D->hasLocalOwningModuleStorage()))
380 return MOK;
381 // If D is not local and we have no local module storage, then we don't
382 // need to track module ownership at all.
383 }
385 }
386
387public:
388 Decl() = delete;
389 Decl(const Decl&) = delete;
390 Decl(Decl &&) = delete;
391 Decl &operator=(const Decl&) = delete;
392 Decl &operator=(Decl&&) = delete;
393
394protected:
396 : NextInContextAndBits(nullptr, getModuleOwnershipKindForChildOf(DC)),
397 DeclCtx(DC), Loc(L), DeclKind(DK), InvalidDecl(false), HasAttrs(false),
398 Implicit(false), Used(false), Referenced(false),
399 TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
401 CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) {
402 if (StatisticsEnabled) add(DK);
403 }
404
406 : DeclKind(DK), InvalidDecl(false), HasAttrs(false), Implicit(false),
407 Used(false), Referenced(false), TopLevelDeclInObjCContainer(false),
410 CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) {
411 if (StatisticsEnabled) add(DK);
412 }
413
414 virtual ~Decl();
415
416 /// Update a potentially out-of-date declaration.
417 void updateOutOfDate(IdentifierInfo &II) const;
418
420 return static_cast<Linkage>(CacheValidAndLinkage);
421 }
422
423 void setCachedLinkage(Linkage L) const {
424 CacheValidAndLinkage = llvm::to_underlying(L);
425 }
426
427 bool hasCachedLinkage() const {
429 }
430
431public:
432 /// Source range that this declaration covers.
433 virtual SourceRange getSourceRange() const LLVM_READONLY {
435 }
436
437 SourceLocation getBeginLoc() const LLVM_READONLY {
438 return getSourceRange().getBegin();
439 }
440
441 SourceLocation getEndLoc() const LLVM_READONLY {
442 return getSourceRange().getEnd();
443 }
444
445 SourceLocation getLocation() const { return Loc; }
446 void setLocation(SourceLocation L) { Loc = L; }
447
448 Kind getKind() const { return static_cast<Kind>(DeclKind); }
449 const char *getDeclKindName() const;
450
452 const Decl *getNextDeclInContext() const {return NextInContextAndBits.getPointer();}
453
455 if (isInSemaDC())
456 return getSemanticDC();
457 return getMultipleDC()->SemanticDC;
458 }
460 return const_cast<Decl*>(this)->getDeclContext();
461 }
462
463 /// Return the non transparent context.
464 /// See the comment of `DeclContext::isTransparentContext()` for the
465 /// definition of transparent context.
468 return const_cast<Decl *>(this)->getNonTransparentDeclContext();
469 }
470
471 /// Find the innermost non-closure ancestor of this declaration,
472 /// walking up through blocks, lambdas, etc. If that ancestor is
473 /// not a code context (!isFunctionOrMethod()), returns null.
474 ///
475 /// A declaration may be its own non-closure context.
477 const Decl *getNonClosureContext() const {
478 return const_cast<Decl*>(this)->getNonClosureContext();
479 }
480
483 return const_cast<Decl*>(this)->getTranslationUnitDecl();
484 }
485
486 bool isInAnonymousNamespace() const;
487
488 bool isInStdNamespace() const;
489
490 // Return true if this is a FileContext Decl.
491 bool isFileContextDecl() const;
492
493 /// Whether it resembles a flexible array member. This is a static member
494 /// because we want to be able to call it with a nullptr. That allows us to
495 /// perform non-Decl specific checks based on the object's type and strict
496 /// flex array level.
497 static bool isFlexibleArrayMemberLike(
498 ASTContext &Context, const Decl *D, QualType Ty,
499 LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel,
500 bool IgnoreTemplateOrMacroSubstitution);
501
502 ASTContext &getASTContext() const LLVM_READONLY;
503
504 /// Helper to get the language options from the ASTContext.
505 /// Defined out of line to avoid depending on ASTContext.h.
506 const LangOptions &getLangOpts() const LLVM_READONLY;
507
509 Access = AS;
510 assert(AccessDeclContextCheck());
511 }
512
514 assert(AccessDeclContextCheck());
515 return AccessSpecifier(Access);
516 }
517
518 /// Retrieve the access specifier for this declaration, even though
519 /// it may not yet have been properly set.
521 return AccessSpecifier(Access);
522 }
523
524 bool hasAttrs() const { return HasAttrs; }
525
526 void setAttrs(const AttrVec& Attrs) {
527 return setAttrsImpl(Attrs, getASTContext());
528 }
529
531 return const_cast<AttrVec&>(const_cast<const Decl*>(this)->getAttrs());
532 }
533
534 const AttrVec &getAttrs() const;
535 void dropAttrs();
536 void addAttr(Attr *A);
537
538 using attr_iterator = AttrVec::const_iterator;
539 using attr_range = llvm::iterator_range<attr_iterator>;
540
542 return attr_range(attr_begin(), attr_end());
543 }
544
546 return hasAttrs() ? getAttrs().begin() : nullptr;
547 }
549 return hasAttrs() ? getAttrs().end() : nullptr;
550 }
551
552 template <typename... Ts> void dropAttrs() {
553 if (!HasAttrs) return;
554
555 AttrVec &Vec = getAttrs();
556 llvm::erase_if(Vec, [](Attr *A) { return isa<Ts...>(A); });
557
558 if (Vec.empty())
559 HasAttrs = false;
560 }
561
562 template <typename T> void dropAttr() { dropAttrs<T>(); }
563
564 template <typename T>
565 llvm::iterator_range<specific_attr_iterator<T>> specific_attrs() const {
566 return llvm::make_range(specific_attr_begin<T>(), specific_attr_end<T>());
567 }
568
569 template <typename T>
572 }
573
574 template <typename T>
577 }
578
579 template<typename T> T *getAttr() const {
580 return hasAttrs() ? getSpecificAttr<T>(getAttrs()) : nullptr;
581 }
582
583 template<typename T> bool hasAttr() const {
584 return hasAttrs() && hasSpecificAttr<T>(getAttrs());
585 }
586
587 /// getMaxAlignment - return the maximum alignment specified by attributes
588 /// on this decl, 0 if there are none.
589 unsigned getMaxAlignment() const;
590
591 /// setInvalidDecl - Indicates the Decl had a semantic error. This
592 /// allows for graceful error recovery.
593 void setInvalidDecl(bool Invalid = true);
594 bool isInvalidDecl() const { return (bool) InvalidDecl; }
595
596 /// isImplicit - Indicates whether the declaration was implicitly
597 /// generated by the implementation. If false, this declaration
598 /// was written explicitly in the source code.
599 bool isImplicit() const { return Implicit; }
600 void setImplicit(bool I = true) { Implicit = I; }
601
602 /// Whether *any* (re-)declaration of the entity was used, meaning that
603 /// a definition is required.
604 ///
605 /// \param CheckUsedAttr When true, also consider the "used" attribute
606 /// (in addition to the "used" bit set by \c setUsed()) when determining
607 /// whether the function is used.
608 bool isUsed(bool CheckUsedAttr = true) const;
609
610 /// Set whether the declaration is used, in the sense of odr-use.
611 ///
612 /// This should only be used immediately after creating a declaration.
613 /// It intentionally doesn't notify any listeners.
614 void setIsUsed() { getCanonicalDecl()->Used = true; }
615
616 /// Mark the declaration used, in the sense of odr-use.
617 ///
618 /// This notifies any mutation listeners in addition to setting a bit
619 /// indicating the declaration is used.
620 void markUsed(ASTContext &C);
621
622 /// Whether any declaration of this entity was referenced.
623 bool isReferenced() const;
624
625 /// Whether this declaration was referenced. This should not be relied
626 /// upon for anything other than debugging.
627 bool isThisDeclarationReferenced() const { return Referenced; }
628
629 void setReferenced(bool R = true) { Referenced = R; }
630
631 /// Whether this declaration is a top-level declaration (function,
632 /// global variable, etc.) that is lexically inside an objc container
633 /// definition.
635 return TopLevelDeclInObjCContainer;
636 }
637
639 TopLevelDeclInObjCContainer = V;
640 }
641
642 /// Looks on this and related declarations for an applicable
643 /// external source symbol attribute.
644 ExternalSourceSymbolAttr *getExternalSourceSymbolAttr() const;
645
646 /// Whether this declaration was marked as being private to the
647 /// module in which it was defined.
648 bool isModulePrivate() const {
650 }
651
652 /// Whether this declaration was exported in a lexical context.
653 /// e.g.:
654 ///
655 /// export namespace A {
656 /// void f1(); // isInExportDeclContext() == true
657 /// }
658 /// void A::f1(); // isInExportDeclContext() == false
659 ///
660 /// namespace B {
661 /// void f2(); // isInExportDeclContext() == false
662 /// }
663 /// export void B::f2(); // isInExportDeclContext() == true
664 bool isInExportDeclContext() const;
665
668 }
669
670 /// Whether this declaration comes from another module unit.
671 bool isInAnotherModuleUnit() const;
672
673 /// Whether this declaration comes from explicit global module.
674 bool isFromExplicitGlobalModule() const;
675
676 /// Return true if this declaration has an attribute which acts as
677 /// definition of the entity, such as 'alias' or 'ifunc'.
678 bool hasDefiningAttr() const;
679
680 /// Return this declaration's defining attribute if it has one.
681 const Attr *getDefiningAttr() const;
682
683protected:
684 /// Specify that this declaration was marked as being private
685 /// to the module in which it was defined.
687 // The module-private specifier has no effect on unowned declarations.
688 // FIXME: We should track this in some way for source fidelity.
690 return;
692 }
693
694public:
695 /// Set the FromASTFile flag. This indicates that this declaration
696 /// was deserialized and not parsed from source code and enables
697 /// features such as module ownership information.
699 FromASTFile = true;
700 }
701
702 /// Set the owning module ID. This may only be called for
703 /// deserialized Decls.
704 void setOwningModuleID(unsigned ID) {
705 assert(isFromASTFile() && "Only works on a deserialized declaration");
706 *((unsigned*)this - 2) = ID;
707 }
708
709public:
710 /// Determine the availability of the given declaration.
711 ///
712 /// This routine will determine the most restrictive availability of
713 /// the given declaration (e.g., preferring 'unavailable' to
714 /// 'deprecated').
715 ///
716 /// \param Message If non-NULL and the result is not \c
717 /// AR_Available, will be set to a (possibly empty) message
718 /// describing why the declaration has not been introduced, is
719 /// deprecated, or is unavailable.
720 ///
721 /// \param EnclosingVersion The version to compare with. If empty, assume the
722 /// deployment target version.
723 ///
724 /// \param RealizedPlatform If non-NULL and the availability result is found
725 /// in an available attribute it will set to the platform which is written in
726 /// the available attribute.
728 getAvailability(std::string *Message = nullptr,
729 VersionTuple EnclosingVersion = VersionTuple(),
730 StringRef *RealizedPlatform = nullptr) const;
731
732 /// Retrieve the version of the target platform in which this
733 /// declaration was introduced.
734 ///
735 /// \returns An empty version tuple if this declaration has no 'introduced'
736 /// availability attributes, or the version tuple that's specified in the
737 /// attribute otherwise.
738 VersionTuple getVersionIntroduced() const;
739
740 /// Determine whether this declaration is marked 'deprecated'.
741 ///
742 /// \param Message If non-NULL and the declaration is deprecated,
743 /// this will be set to the message describing why the declaration
744 /// was deprecated (which may be empty).
745 bool isDeprecated(std::string *Message = nullptr) const {
746 return getAvailability(Message) == AR_Deprecated;
747 }
748
749 /// Determine whether this declaration is marked 'unavailable'.
750 ///
751 /// \param Message If non-NULL and the declaration is unavailable,
752 /// this will be set to the message describing why the declaration
753 /// was made unavailable (which may be empty).
754 bool isUnavailable(std::string *Message = nullptr) const {
755 return getAvailability(Message) == AR_Unavailable;
756 }
757
758 /// Determine whether this is a weak-imported symbol.
759 ///
760 /// Weak-imported symbols are typically marked with the
761 /// 'weak_import' attribute, but may also be marked with an
762 /// 'availability' attribute where we're targing a platform prior to
763 /// the introduction of this feature.
764 bool isWeakImported() const;
765
766 /// Determines whether this symbol can be weak-imported,
767 /// e.g., whether it would be well-formed to add the weak_import
768 /// attribute.
769 ///
770 /// \param IsDefinition Set to \c true to indicate that this
771 /// declaration cannot be weak-imported because it has a definition.
772 bool canBeWeakImported(bool &IsDefinition) const;
773
774 /// Determine whether this declaration came from an AST file (such as
775 /// a precompiled header or module) rather than having been parsed.
776 bool isFromASTFile() const { return FromASTFile; }
777
778 /// Retrieve the global declaration ID associated with this
779 /// declaration, which specifies where this Decl was loaded from.
781 if (isFromASTFile())
782 return (*((const GlobalDeclID *)this - 1));
783 return GlobalDeclID();
784 }
785
786 /// Retrieve the global ID of the module that owns this particular
787 /// declaration.
788 unsigned getOwningModuleID() const {
789 if (isFromASTFile())
790 return *((const unsigned*)this - 2);
791 return 0;
792 }
793
794private:
795 Module *getOwningModuleSlow() const;
796
797protected:
798 bool hasLocalOwningModuleStorage() const;
799
800public:
801 /// Get the imported owning module, if this decl is from an imported
802 /// (non-local) module.
804 if (!isFromASTFile() || !hasOwningModule())
805 return nullptr;
806
807 return getOwningModuleSlow();
808 }
809
810 /// Get the local owning module, if known. Returns nullptr if owner is
811 /// not yet known or declaration is not from a module.
813 if (isFromASTFile() || !hasOwningModule())
814 return nullptr;
815
817 "owned local decl but no local module storage");
818 return reinterpret_cast<Module *const *>(this)[-1];
819 }
821 assert(!isFromASTFile() && hasOwningModule() &&
823 "should not have a cached owning module");
824 reinterpret_cast<Module **>(this)[-1] = M;
825 }
826
827 /// Is this declaration owned by some module?
828 bool hasOwningModule() const {
830 }
831
832 /// Get the module that owns this declaration (for visibility purposes).
835 }
836
837 /// Get the module that owns this declaration for linkage purposes.
838 /// There only ever is such a standard C++ module.
839 ///
840 /// \param IgnoreLinkage Ignore the linkage of the entity; assume that
841 /// all declarations in a global module fragment are unowned.
842 Module *getOwningModuleForLinkage(bool IgnoreLinkage = false) const;
843
844 /// Determine whether this declaration is definitely visible to name lookup,
845 /// independent of whether the owning module is visible.
846 /// Note: The declaration may be visible even if this returns \c false if the
847 /// owning module is visible within the query context. This is a low-level
848 /// helper function; most code should be calling Sema::isVisible() instead.
851 }
852
853 bool isReachable() const {
854 return (int)getModuleOwnershipKind() <=
856 }
857
858 /// Set that this declaration is globally visible, even if it came from a
859 /// module that is not visible.
863 }
864
865 /// Get the kind of module ownership for this declaration.
867 return NextInContextAndBits.getInt();
868 }
869
870 /// Set whether this declaration is hidden from name lookup.
875 "no storage available for owning module for this declaration");
876 NextInContextAndBits.setInt(MOK);
877 }
878
879 unsigned getIdentifierNamespace() const {
880 return IdentifierNamespace;
881 }
882
883 bool isInIdentifierNamespace(unsigned NS) const {
884 return getIdentifierNamespace() & NS;
885 }
886
887 static unsigned getIdentifierNamespaceForKind(Kind DK);
888
891 }
892
893 static bool isTagIdentifierNamespace(unsigned NS) {
894 // TagDecls have Tag and Type set and may also have TagFriend.
895 return (NS & ~IDNS_TagFriend) == (IDNS_Tag | IDNS_Type);
896 }
897
898 /// getLexicalDeclContext - The declaration context where this Decl was
899 /// lexically declared (LexicalDC). May be different from
900 /// getDeclContext() (SemanticDC).
901 /// e.g.:
902 ///
903 /// namespace A {
904 /// void f(); // SemanticDC == LexicalDC == 'namespace A'
905 /// }
906 /// void A::f(); // SemanticDC == namespace 'A'
907 /// // LexicalDC == global namespace
909 if (isInSemaDC())
910 return getSemanticDC();
911 return getMultipleDC()->LexicalDC;
912 }
914 return const_cast<Decl*>(this)->getLexicalDeclContext();
915 }
916
917 /// Determine whether this declaration is declared out of line (outside its
918 /// semantic context).
919 virtual bool isOutOfLine() const;
920
921 /// setDeclContext - Set both the semantic and lexical DeclContext
922 /// to DC.
923 void setDeclContext(DeclContext *DC);
924
926
927 /// Determine whether this declaration is a templated entity (whether it is
928 // within the scope of a template parameter).
929 bool isTemplated() const;
930
931 /// Determine the number of levels of template parameter surrounding this
932 /// declaration.
933 unsigned getTemplateDepth() const;
934
935 /// isDefinedOutsideFunctionOrMethod - This predicate returns true if this
936 /// scoped decl is defined outside the current function or method. This is
937 /// roughly global variables and functions, but also handles enums (which
938 /// could be defined inside or outside a function etc).
940 return getParentFunctionOrMethod() == nullptr;
941 }
942
943 /// Determine whether a substitution into this declaration would occur as
944 /// part of a substitution into a dependent local scope. Such a substitution
945 /// transitively substitutes into all constructs nested within this
946 /// declaration.
947 ///
948 /// This recognizes non-defining declarations as well as members of local
949 /// classes and lambdas:
950 /// \code
951 /// template<typename T> void foo() { void bar(); }
952 /// template<typename T> void foo2() { class ABC { void bar(); }; }
953 /// template<typename T> inline int x = [](){ return 0; }();
954 /// \endcode
956
957 /// If this decl is defined inside a function/method/block it returns
958 /// the corresponding DeclContext, otherwise it returns null.
959 const DeclContext *
960 getParentFunctionOrMethod(bool LexicalParent = false) const;
961 DeclContext *getParentFunctionOrMethod(bool LexicalParent = false) {
962 return const_cast<DeclContext *>(
963 const_cast<const Decl *>(this)->getParentFunctionOrMethod(
964 LexicalParent));
965 }
966
967 /// Retrieves the "canonical" declaration of the given declaration.
968 virtual Decl *getCanonicalDecl() { return this; }
969 const Decl *getCanonicalDecl() const {
970 return const_cast<Decl*>(this)->getCanonicalDecl();
971 }
972
973 /// Whether this particular Decl is a canonical one.
974 bool isCanonicalDecl() const { return getCanonicalDecl() == this; }
975
976protected:
977 /// Returns the next redeclaration or itself if this is the only decl.
978 ///
979 /// Decl subclasses that can be redeclared should override this method so that
980 /// Decl::redecl_iterator can iterate over them.
981 virtual Decl *getNextRedeclarationImpl() { return this; }
982
983 /// Implementation of getPreviousDecl(), to be overridden by any
984 /// subclass that has a redeclaration chain.
985 virtual Decl *getPreviousDeclImpl() { return nullptr; }
986
987 /// Implementation of getMostRecentDecl(), to be overridden by any
988 /// subclass that has a redeclaration chain.
989 virtual Decl *getMostRecentDeclImpl() { return this; }
990
991public:
992 /// Iterates through all the redeclarations of the same decl.
994 /// Current - The current declaration.
995 Decl *Current = nullptr;
996 Decl *Starter;
997
998 public:
999 using value_type = Decl *;
1000 using reference = const value_type &;
1001 using pointer = const value_type *;
1002 using iterator_category = std::forward_iterator_tag;
1003 using difference_type = std::ptrdiff_t;
1004
1005 redecl_iterator() = default;
1006 explicit redecl_iterator(Decl *C) : Current(C), Starter(C) {}
1007
1008 reference operator*() const { return Current; }
1009 value_type operator->() const { return Current; }
1010
1012 assert(Current && "Advancing while iterator has reached end");
1013 // Get either previous decl or latest decl.
1014 Decl *Next = Current->getNextRedeclarationImpl();
1015 assert(Next && "Should return next redeclaration or itself, never null!");
1016 Current = (Next != Starter) ? Next : nullptr;
1017 return *this;
1018 }
1019
1021 redecl_iterator tmp(*this);
1022 ++(*this);
1023 return tmp;
1024 }
1025
1027 return x.Current == y.Current;
1028 }
1029
1031 return x.Current != y.Current;
1032 }
1033 };
1034
1035 using redecl_range = llvm::iterator_range<redecl_iterator>;
1036
1037 /// Returns an iterator range for all the redeclarations of the same
1038 /// decl. It will iterate at least once (when this decl is the only one).
1041 }
1042
1044 return redecl_iterator(const_cast<Decl *>(this));
1045 }
1046
1048
1049 /// Retrieve the previous declaration that declares the same entity
1050 /// as this declaration, or NULL if there is no previous declaration.
1052
1053 /// Retrieve the previous declaration that declares the same entity
1054 /// as this declaration, or NULL if there is no previous declaration.
1055 const Decl *getPreviousDecl() const {
1056 return const_cast<Decl *>(this)->getPreviousDeclImpl();
1057 }
1058
1059 /// True if this is the first declaration in its redeclaration chain.
1060 bool isFirstDecl() const {
1061 return getPreviousDecl() == nullptr;
1062 }
1063
1064 /// Retrieve the most recent declaration that declares the same entity
1065 /// as this declaration (which may be this declaration).
1067
1068 /// Retrieve the most recent declaration that declares the same entity
1069 /// as this declaration (which may be this declaration).
1070 const Decl *getMostRecentDecl() const {
1071 return const_cast<Decl *>(this)->getMostRecentDeclImpl();
1072 }
1073
1074 /// getBody - If this Decl represents a declaration for a body of code,
1075 /// such as a function or method definition, this method returns the
1076 /// top-level Stmt* of that body. Otherwise this method returns null.
1077 virtual Stmt* getBody() const { return nullptr; }
1078
1079 /// Returns true if this \c Decl represents a declaration for a body of
1080 /// code, such as a function or method definition.
1081 /// Note that \c hasBody can also return true if any redeclaration of this
1082 /// \c Decl represents a declaration for a body of code.
1083 virtual bool hasBody() const { return getBody() != nullptr; }
1084
1085 /// getBodyRBrace - Gets the right brace of the body, if a body exists.
1086 /// This works whether the body is a CompoundStmt or a CXXTryStmt.
1088
1089 // global temp stats (until we have a per-module visitor)
1090 static void add(Kind k);
1091 static void EnableStatistics();
1092 static void PrintStats();
1093
1094 /// isTemplateParameter - Determines whether this declaration is a
1095 /// template parameter.
1096 bool isTemplateParameter() const;
1097
1098 /// isTemplateParameter - Determines whether this declaration is a
1099 /// template parameter pack.
1100 bool isTemplateParameterPack() const;
1101
1102 /// Whether this declaration is a parameter pack.
1103 bool isParameterPack() const;
1104
1105 /// returns true if this declaration is a template
1106 bool isTemplateDecl() const;
1107
1108 /// Whether this declaration is a function or function template.
1110 return (DeclKind >= Decl::firstFunction &&
1111 DeclKind <= Decl::lastFunction) ||
1112 DeclKind == FunctionTemplate;
1113 }
1114
1115 /// If this is a declaration that describes some template, this
1116 /// method returns that template declaration.
1117 ///
1118 /// Note that this returns nullptr for partial specializations, because they
1119 /// are not modeled as TemplateDecls. Use getDescribedTemplateParams to handle
1120 /// those cases.
1122
1123 /// If this is a declaration that describes some template or partial
1124 /// specialization, this returns the corresponding template parameter list.
1126
1127 /// Returns the function itself, or the templated function if this is a
1128 /// function template.
1129 FunctionDecl *getAsFunction() LLVM_READONLY;
1130
1132 return const_cast<Decl *>(this)->getAsFunction();
1133 }
1134
1135 /// Changes the namespace of this declaration to reflect that it's
1136 /// a function-local extern declaration.
1137 ///
1138 /// These declarations appear in the lexical context of the extern
1139 /// declaration, but in the semantic context of the enclosing namespace
1140 /// scope.
1142 Decl *Prev = getPreviousDecl();
1143 IdentifierNamespace &= ~IDNS_Ordinary;
1144
1145 // It's OK for the declaration to still have the "invisible friend" flag or
1146 // the "conflicts with tag declarations in this scope" flag for the outer
1147 // scope.
1148 assert((IdentifierNamespace & ~(IDNS_OrdinaryFriend | IDNS_Tag)) == 0 &&
1149 "namespace is not ordinary");
1150
1152 if (Prev && Prev->getIdentifierNamespace() & IDNS_Ordinary)
1154 }
1155
1156 /// Determine whether this is a block-scope declaration with linkage.
1157 /// This will either be a local variable declaration declared 'extern', or a
1158 /// local function declaration.
1159 bool isLocalExternDecl() const {
1161 }
1162
1163 /// Changes the namespace of this declaration to reflect that it's
1164 /// the object of a friend declaration.
1165 ///
1166 /// These declarations appear in the lexical context of the friending
1167 /// class, but in the semantic context of the actual entity. This property
1168 /// applies only to a specific decl object; other redeclarations of the
1169 /// same entity may not (and probably don't) share this property.
1170 void setObjectOfFriendDecl(bool PerformFriendInjection = false) {
1171 unsigned OldNS = IdentifierNamespace;
1172 assert((OldNS & (IDNS_Tag | IDNS_Ordinary |
1175 "namespace includes neither ordinary nor tag");
1176 assert(!(OldNS & ~(IDNS_Tag | IDNS_Ordinary | IDNS_Type |
1179 "namespace includes other than ordinary or tag");
1180
1181 Decl *Prev = getPreviousDecl();
1183
1184 if (OldNS & (IDNS_Tag | IDNS_TagFriend)) {
1186 if (PerformFriendInjection ||
1187 (Prev && Prev->getIdentifierNamespace() & IDNS_Tag))
1189 }
1190
1191 if (OldNS & (IDNS_Ordinary | IDNS_OrdinaryFriend |
1194 if (PerformFriendInjection ||
1195 (Prev && Prev->getIdentifierNamespace() & IDNS_Ordinary))
1197 }
1198 }
1199
1200 /// Clears the namespace of this declaration.
1201 ///
1202 /// This is useful if we want this declaration to be available for
1203 /// redeclaration lookup but otherwise hidden for ordinary name lookups.
1205
1207 FOK_None, ///< Not a friend object.
1208 FOK_Declared, ///< A friend of a previously-declared entity.
1209 FOK_Undeclared ///< A friend of a previously-undeclared entity.
1211
1212 /// Determines whether this declaration is the object of a
1213 /// friend declaration and, if so, what kind.
1214 ///
1215 /// There is currently no direct way to find the associated FriendDecl.
1217 unsigned mask =
1219 if (!mask) return FOK_None;
1221 : FOK_Undeclared);
1222 }
1223
1224 /// Specifies that this declaration is a C++ overloaded non-member.
1226 assert(getKind() == Function || getKind() == FunctionTemplate);
1228 "visible non-member operators should be in ordinary namespace");
1230 }
1231
1232 static bool classofKind(Kind K) { return true; }
1233 static DeclContext *castToDeclContext(const Decl *);
1234 static Decl *castFromDeclContext(const DeclContext *);
1235
1236 void print(raw_ostream &Out, unsigned Indentation = 0,
1237 bool PrintInstantiation = false) const;
1238 void print(raw_ostream &Out, const PrintingPolicy &Policy,
1239 unsigned Indentation = 0, bool PrintInstantiation = false) const;
1240 static void printGroup(Decl** Begin, unsigned NumDecls,
1241 raw_ostream &Out, const PrintingPolicy &Policy,
1242 unsigned Indentation = 0);
1243
1244 // Debuggers don't usually respect default arguments.
1245 void dump() const;
1246
1247 // Same as dump(), but forces color printing.
1248 void dumpColor() const;
1249
1250 void dump(raw_ostream &Out, bool Deserialize = false,
1251 ASTDumpOutputFormat OutputFormat = ADOF_Default) const;
1252
1253 /// \return Unique reproducible object identifier
1254 int64_t getID() const;
1255
1256 /// Looks through the Decl's underlying type to extract a FunctionType
1257 /// when possible. Will return null if the type underlying the Decl does not
1258 /// have a FunctionType.
1259 const FunctionType *getFunctionType(bool BlocksToo = true) const;
1260
1261 // Looks through the Decl's underlying type to determine if it's a
1262 // function pointer type.
1263 bool isFunctionPointerType() const;
1264
1265private:
1266 void setAttrsImpl(const AttrVec& Attrs, ASTContext &Ctx);
1267 void setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
1268 ASTContext &Ctx);
1269
1270protected:
1272};
1273
1274/// Determine whether two declarations declare the same entity.
1275inline bool declaresSameEntity(const Decl *D1, const Decl *D2) {
1276 if (!D1 || !D2)
1277 return false;
1278
1279 if (D1 == D2)
1280 return true;
1281
1282 return D1->getCanonicalDecl() == D2->getCanonicalDecl();
1283}
1284
1285/// PrettyStackTraceDecl - If a crash occurs, indicate that it happened when
1286/// doing something to a specific decl.
1287class PrettyStackTraceDecl : public llvm::PrettyStackTraceEntry {
1288 const Decl *TheDecl;
1289 SourceLocation Loc;
1290 SourceManager &SM;
1291 const char *Message;
1292
1293public:
1295 SourceManager &sm, const char *Msg)
1296 : TheDecl(theDecl), Loc(L), SM(sm), Message(Msg) {}
1297
1298 void print(raw_ostream &OS) const override;
1299};
1300} // namespace clang
1301
1302// Required to determine the layout of the PointerUnion<NamedDecl*> before
1303// seeing the NamedDecl definition being first used in DeclListNode::operator*.
1304namespace llvm {
1305 template <> struct PointerLikeTypeTraits<::clang::NamedDecl *> {
1306 static inline void *getAsVoidPointer(::clang::NamedDecl *P) { return P; }
1307 static inline ::clang::NamedDecl *getFromVoidPointer(void *P) {
1308 return static_cast<::clang::NamedDecl *>(P);
1309 }
1310 static constexpr int NumLowBitsAvailable = 3;
1311 };
1312}
1313
1314namespace clang {
1315/// A list storing NamedDecls in the lookup tables.
1317 friend class ASTContext; // allocate, deallocate nodes.
1318 friend class StoredDeclsList;
1319public:
1320 using Decls = llvm::PointerUnion<NamedDecl*, DeclListNode*>;
1321 class iterator {
1323 friend class StoredDeclsList;
1324
1325 Decls Ptr;
1326 iterator(Decls Node) : Ptr(Node) { }
1327 public:
1330 using pointer = void;
1332 using iterator_category = std::forward_iterator_tag;
1333
1334 iterator() = default;
1335
1337 assert(Ptr && "dereferencing end() iterator");
1338 if (DeclListNode *CurNode = Ptr.dyn_cast<DeclListNode*>())
1339 return CurNode->D;
1340 return Ptr.get<NamedDecl*>();
1341 }
1342 void operator->() const { } // Unsupported.
1343 bool operator==(const iterator &X) const { return Ptr == X.Ptr; }
1344 bool operator!=(const iterator &X) const { return Ptr != X.Ptr; }
1345 inline iterator &operator++() { // ++It
1346 assert(!Ptr.isNull() && "Advancing empty iterator");
1347
1348 if (DeclListNode *CurNode = Ptr.dyn_cast<DeclListNode*>())
1349 Ptr = CurNode->Rest;
1350 else
1351 Ptr = nullptr;
1352 return *this;
1353 }
1354 iterator operator++(int) { // It++
1355 iterator temp = *this;
1356 ++(*this);
1357 return temp;
1358 }
1359 // Enables the pattern for (iterator I =..., E = I.end(); I != E; ++I)
1360 iterator end() { return iterator(); }
1361 };
1362private:
1363 NamedDecl *D = nullptr;
1364 Decls Rest = nullptr;
1365 DeclListNode(NamedDecl *ND) : D(ND) {}
1366};
1367
1368/// The results of name lookup within a DeclContext.
1370 using Decls = DeclListNode::Decls;
1371
1372 /// When in collection form, this is what the Data pointer points to.
1373 Decls Result;
1374
1375public:
1377 DeclContextLookupResult(Decls Result) : Result(Result) {}
1378
1382
1383 iterator begin() { return iterator(Result); }
1384 iterator end() { return iterator(); }
1386 return const_cast<DeclContextLookupResult*>(this)->begin();
1387 }
1388 const_iterator end() const { return iterator(); }
1389
1390 bool empty() const { return Result.isNull(); }
1391 bool isSingleResult() const { return Result.dyn_cast<NamedDecl*>(); }
1392 reference front() const { return *begin(); }
1393
1394 // Find the first declaration of the given type in the list. Note that this
1395 // is not in general the earliest-declared declaration, and should only be
1396 // used when it's not possible for there to be more than one match or where
1397 // it doesn't matter which one is found.
1398 template<class T> T *find_first() const {
1399 for (auto *D : *this)
1400 if (T *Decl = dyn_cast<T>(D))
1401 return Decl;
1402
1403 return nullptr;
1404 }
1405};
1406
1407/// Only used by CXXDeductionGuideDecl.
1408enum class DeductionCandidate : unsigned char {
1409 Normal,
1410 Copy,
1411 Aggregate,
1412};
1413
1414enum class RecordArgPassingKind;
1416enum class ObjCImplementationControl;
1417enum class LinkageSpecLanguageIDs;
1418
1419/// DeclContext - This is used only as base class of specific decl types that
1420/// can act as declaration contexts. These decls are (only the top classes
1421/// that directly derive from DeclContext are mentioned, not their subclasses):
1422///
1423/// TranslationUnitDecl
1424/// ExternCContext
1425/// NamespaceDecl
1426/// TagDecl
1427/// OMPDeclareReductionDecl
1428/// OMPDeclareMapperDecl
1429/// FunctionDecl
1430/// ObjCMethodDecl
1431/// ObjCContainerDecl
1432/// LinkageSpecDecl
1433/// ExportDecl
1434/// BlockDecl
1435/// CapturedDecl
1437 /// For makeDeclVisibleInContextImpl
1438 friend class ASTDeclReader;
1439 /// For checking the new bits in the Serialization part.
1440 friend class ASTDeclWriter;
1441 /// For reconcileExternalVisibleStorage, CreateStoredDeclsMap,
1442 /// hasNeedToReconcileExternalVisibleStorage
1443 friend class ExternalASTSource;
1444 /// For CreateStoredDeclsMap
1446 /// For hasNeedToReconcileExternalVisibleStorage,
1447 /// hasLazyLocalLexicalLookups, hasLazyExternalLexicalLookups
1448 friend class ASTWriter;
1449
1450 // We use uint64_t in the bit-fields below since some bit-fields
1451 // cross the unsigned boundary and this breaks the packing.
1452
1453 /// Stores the bits used by DeclContext.
1454 /// If modified NumDeclContextBit, the ctor of DeclContext and the accessor
1455 /// methods in DeclContext should be updated appropriately.
1456 class DeclContextBitfields {
1457 friend class DeclContext;
1458 /// DeclKind - This indicates which class this is.
1459 LLVM_PREFERRED_TYPE(Decl::Kind)
1460 uint64_t DeclKind : 7;
1461
1462 /// Whether this declaration context also has some external
1463 /// storage that contains additional declarations that are lexically
1464 /// part of this context.
1465 LLVM_PREFERRED_TYPE(bool)
1466 mutable uint64_t ExternalLexicalStorage : 1;
1467
1468 /// Whether this declaration context also has some external
1469 /// storage that contains additional declarations that are visible
1470 /// in this context.
1471 LLVM_PREFERRED_TYPE(bool)
1472 mutable uint64_t ExternalVisibleStorage : 1;
1473
1474 /// Whether this declaration context has had externally visible
1475 /// storage added since the last lookup. In this case, \c LookupPtr's
1476 /// invariant may not hold and needs to be fixed before we perform
1477 /// another lookup.
1478 LLVM_PREFERRED_TYPE(bool)
1479 mutable uint64_t NeedToReconcileExternalVisibleStorage : 1;
1480
1481 /// If \c true, this context may have local lexical declarations
1482 /// that are missing from the lookup table.
1483 LLVM_PREFERRED_TYPE(bool)
1484 mutable uint64_t HasLazyLocalLexicalLookups : 1;
1485
1486 /// If \c true, the external source may have lexical declarations
1487 /// that are missing from the lookup table.
1488 LLVM_PREFERRED_TYPE(bool)
1489 mutable uint64_t HasLazyExternalLexicalLookups : 1;
1490
1491 /// If \c true, lookups should only return identifier from
1492 /// DeclContext scope (for example TranslationUnit). Used in
1493 /// LookupQualifiedName()
1494 LLVM_PREFERRED_TYPE(bool)
1495 mutable uint64_t UseQualifiedLookup : 1;
1496 };
1497
1498 /// Number of bits in DeclContextBitfields.
1499 enum { NumDeclContextBits = 13 };
1500
1501 /// Stores the bits used by TagDecl.
1502 /// If modified NumTagDeclBits and the accessor
1503 /// methods in TagDecl should be updated appropriately.
1504 class TagDeclBitfields {
1505 friend class TagDecl;
1506 /// For the bits in DeclContextBitfields
1507 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1508 uint64_t : NumDeclContextBits;
1509
1510 /// The TagKind enum.
1511 LLVM_PREFERRED_TYPE(TagTypeKind)
1512 uint64_t TagDeclKind : 3;
1513
1514 /// True if this is a definition ("struct foo {};"), false if it is a
1515 /// declaration ("struct foo;"). It is not considered a definition
1516 /// until the definition has been fully processed.
1517 LLVM_PREFERRED_TYPE(bool)
1518 uint64_t IsCompleteDefinition : 1;
1519
1520 /// True if this is currently being defined.
1521 LLVM_PREFERRED_TYPE(bool)
1522 uint64_t IsBeingDefined : 1;
1523
1524 /// True if this tag declaration is "embedded" (i.e., defined or declared
1525 /// for the very first time) in the syntax of a declarator.
1526 LLVM_PREFERRED_TYPE(bool)
1527 uint64_t IsEmbeddedInDeclarator : 1;
1528
1529 /// True if this tag is free standing, e.g. "struct foo;".
1530 LLVM_PREFERRED_TYPE(bool)
1531 uint64_t IsFreeStanding : 1;
1532
1533 /// Indicates whether it is possible for declarations of this kind
1534 /// to have an out-of-date definition.
1535 ///
1536 /// This option is only enabled when modules are enabled.
1537 LLVM_PREFERRED_TYPE(bool)
1538 uint64_t MayHaveOutOfDateDef : 1;
1539
1540 /// Has the full definition of this type been required by a use somewhere in
1541 /// the TU.
1542 LLVM_PREFERRED_TYPE(bool)
1543 uint64_t IsCompleteDefinitionRequired : 1;
1544
1545 /// Whether this tag is a definition which was demoted due to
1546 /// a module merge.
1547 LLVM_PREFERRED_TYPE(bool)
1548 uint64_t IsThisDeclarationADemotedDefinition : 1;
1549 };
1550
1551 /// Number of inherited and non-inherited bits in TagDeclBitfields.
1552 enum { NumTagDeclBits = NumDeclContextBits + 10 };
1553
1554 /// Stores the bits used by EnumDecl.
1555 /// If modified NumEnumDeclBit and the accessor
1556 /// methods in EnumDecl should be updated appropriately.
1557 class EnumDeclBitfields {
1558 friend class EnumDecl;
1559 /// For the bits in TagDeclBitfields.
1560 LLVM_PREFERRED_TYPE(TagDeclBitfields)
1561 uint64_t : NumTagDeclBits;
1562
1563 /// Width in bits required to store all the non-negative
1564 /// enumerators of this enum.
1565 uint64_t NumPositiveBits : 8;
1566
1567 /// Width in bits required to store all the negative
1568 /// enumerators of this enum.
1569 uint64_t NumNegativeBits : 8;
1570
1571 /// True if this tag declaration is a scoped enumeration. Only
1572 /// possible in C++11 mode.
1573 LLVM_PREFERRED_TYPE(bool)
1574 uint64_t IsScoped : 1;
1575
1576 /// If this tag declaration is a scoped enum,
1577 /// then this is true if the scoped enum was declared using the class
1578 /// tag, false if it was declared with the struct tag. No meaning is
1579 /// associated if this tag declaration is not a scoped enum.
1580 LLVM_PREFERRED_TYPE(bool)
1581 uint64_t IsScopedUsingClassTag : 1;
1582
1583 /// True if this is an enumeration with fixed underlying type. Only
1584 /// possible in C++11, Microsoft extensions, or Objective C mode.
1585 LLVM_PREFERRED_TYPE(bool)
1586 uint64_t IsFixed : 1;
1587
1588 /// True if a valid hash is stored in ODRHash.
1589 LLVM_PREFERRED_TYPE(bool)
1590 uint64_t HasODRHash : 1;
1591 };
1592
1593 /// Number of inherited and non-inherited bits in EnumDeclBitfields.
1594 enum { NumEnumDeclBits = NumTagDeclBits + 20 };
1595
1596 /// Stores the bits used by RecordDecl.
1597 /// If modified NumRecordDeclBits and the accessor
1598 /// methods in RecordDecl should be updated appropriately.
1599 class RecordDeclBitfields {
1600 friend class RecordDecl;
1601 /// For the bits in TagDeclBitfields.
1602 LLVM_PREFERRED_TYPE(TagDeclBitfields)
1603 uint64_t : NumTagDeclBits;
1604
1605 /// This is true if this struct ends with a flexible
1606 /// array member (e.g. int X[]) or if this union contains a struct that does.
1607 /// If so, this cannot be contained in arrays or other structs as a member.
1608 LLVM_PREFERRED_TYPE(bool)
1609 uint64_t HasFlexibleArrayMember : 1;
1610
1611 /// Whether this is the type of an anonymous struct or union.
1612 LLVM_PREFERRED_TYPE(bool)
1613 uint64_t AnonymousStructOrUnion : 1;
1614
1615 /// This is true if this struct has at least one member
1616 /// containing an Objective-C object pointer type.
1617 LLVM_PREFERRED_TYPE(bool)
1618 uint64_t HasObjectMember : 1;
1619
1620 /// This is true if struct has at least one member of
1621 /// 'volatile' type.
1622 LLVM_PREFERRED_TYPE(bool)
1623 uint64_t HasVolatileMember : 1;
1624
1625 /// Whether the field declarations of this record have been loaded
1626 /// from external storage. To avoid unnecessary deserialization of
1627 /// methods/nested types we allow deserialization of just the fields
1628 /// when needed.
1629 LLVM_PREFERRED_TYPE(bool)
1630 mutable uint64_t LoadedFieldsFromExternalStorage : 1;
1631
1632 /// Basic properties of non-trivial C structs.
1633 LLVM_PREFERRED_TYPE(bool)
1634 uint64_t NonTrivialToPrimitiveDefaultInitialize : 1;
1635 LLVM_PREFERRED_TYPE(bool)
1636 uint64_t NonTrivialToPrimitiveCopy : 1;
1637 LLVM_PREFERRED_TYPE(bool)
1638 uint64_t NonTrivialToPrimitiveDestroy : 1;
1639
1640 /// The following bits indicate whether this is or contains a C union that
1641 /// is non-trivial to default-initialize, destruct, or copy. These bits
1642 /// imply the associated basic non-triviality predicates declared above.
1643 LLVM_PREFERRED_TYPE(bool)
1644 uint64_t HasNonTrivialToPrimitiveDefaultInitializeCUnion : 1;
1645 LLVM_PREFERRED_TYPE(bool)
1646 uint64_t HasNonTrivialToPrimitiveDestructCUnion : 1;
1647 LLVM_PREFERRED_TYPE(bool)
1648 uint64_t HasNonTrivialToPrimitiveCopyCUnion : 1;
1649
1650 /// Indicates whether this struct is destroyed in the callee.
1651 LLVM_PREFERRED_TYPE(bool)
1652 uint64_t ParamDestroyedInCallee : 1;
1653
1654 /// Represents the way this type is passed to a function.
1655 LLVM_PREFERRED_TYPE(RecordArgPassingKind)
1656 uint64_t ArgPassingRestrictions : 2;
1657
1658 /// Indicates whether this struct has had its field layout randomized.
1659 LLVM_PREFERRED_TYPE(bool)
1660 uint64_t IsRandomized : 1;
1661
1662 /// True if a valid hash is stored in ODRHash. This should shave off some
1663 /// extra storage and prevent CXXRecordDecl to store unused bits.
1664 uint64_t ODRHash : 26;
1665 };
1666
1667 /// Number of inherited and non-inherited bits in RecordDeclBitfields.
1668 enum { NumRecordDeclBits = NumTagDeclBits + 41 };
1669
1670 /// Stores the bits used by OMPDeclareReductionDecl.
1671 /// If modified NumOMPDeclareReductionDeclBits and the accessor
1672 /// methods in OMPDeclareReductionDecl should be updated appropriately.
1673 class OMPDeclareReductionDeclBitfields {
1674 friend class OMPDeclareReductionDecl;
1675 /// For the bits in DeclContextBitfields
1676 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1677 uint64_t : NumDeclContextBits;
1678
1679 /// Kind of initializer,
1680 /// function call or omp_priv<init_expr> initialization.
1681 LLVM_PREFERRED_TYPE(OMPDeclareReductionInitKind)
1682 uint64_t InitializerKind : 2;
1683 };
1684
1685 /// Number of inherited and non-inherited bits in
1686 /// OMPDeclareReductionDeclBitfields.
1687 enum { NumOMPDeclareReductionDeclBits = NumDeclContextBits + 2 };
1688
1689 /// Stores the bits used by FunctionDecl.
1690 /// If modified NumFunctionDeclBits and the accessor
1691 /// methods in FunctionDecl and CXXDeductionGuideDecl
1692 /// (for DeductionCandidateKind) should be updated appropriately.
1693 class FunctionDeclBitfields {
1694 friend class FunctionDecl;
1695 /// For DeductionCandidateKind
1696 friend class CXXDeductionGuideDecl;
1697 /// For the bits in DeclContextBitfields.
1698 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1699 uint64_t : NumDeclContextBits;
1700
1701 LLVM_PREFERRED_TYPE(StorageClass)
1702 uint64_t SClass : 3;
1703 LLVM_PREFERRED_TYPE(bool)
1704 uint64_t IsInline : 1;
1705 LLVM_PREFERRED_TYPE(bool)
1706 uint64_t IsInlineSpecified : 1;
1707
1708 LLVM_PREFERRED_TYPE(bool)
1709 uint64_t IsVirtualAsWritten : 1;
1710 LLVM_PREFERRED_TYPE(bool)
1711 uint64_t IsPureVirtual : 1;
1712 LLVM_PREFERRED_TYPE(bool)
1713 uint64_t HasInheritedPrototype : 1;
1714 LLVM_PREFERRED_TYPE(bool)
1715 uint64_t HasWrittenPrototype : 1;
1716 LLVM_PREFERRED_TYPE(bool)
1717 uint64_t IsDeleted : 1;
1718 /// Used by CXXMethodDecl
1719 LLVM_PREFERRED_TYPE(bool)
1720 uint64_t IsTrivial : 1;
1721
1722 /// This flag indicates whether this function is trivial for the purpose of
1723 /// calls. This is meaningful only when this function is a copy/move
1724 /// constructor or a destructor.
1725 LLVM_PREFERRED_TYPE(bool)
1726 uint64_t IsTrivialForCall : 1;
1727
1728 LLVM_PREFERRED_TYPE(bool)
1729 uint64_t IsDefaulted : 1;
1730 LLVM_PREFERRED_TYPE(bool)
1731 uint64_t IsExplicitlyDefaulted : 1;
1732 LLVM_PREFERRED_TYPE(bool)
1733 uint64_t HasDefaultedOrDeletedInfo : 1;
1734
1735 /// For member functions of complete types, whether this is an ineligible
1736 /// special member function or an unselected destructor. See
1737 /// [class.mem.special].
1738 LLVM_PREFERRED_TYPE(bool)
1739 uint64_t IsIneligibleOrNotSelected : 1;
1740
1741 LLVM_PREFERRED_TYPE(bool)
1742 uint64_t HasImplicitReturnZero : 1;
1743 LLVM_PREFERRED_TYPE(bool)
1744 uint64_t IsLateTemplateParsed : 1;
1745
1746 /// Kind of contexpr specifier as defined by ConstexprSpecKind.
1747 LLVM_PREFERRED_TYPE(ConstexprSpecKind)
1748 uint64_t ConstexprKind : 2;
1749 LLVM_PREFERRED_TYPE(bool)
1750 uint64_t BodyContainsImmediateEscalatingExpression : 1;
1751
1752 LLVM_PREFERRED_TYPE(bool)
1753 uint64_t InstantiationIsPending : 1;
1754
1755 /// Indicates if the function uses __try.
1756 LLVM_PREFERRED_TYPE(bool)
1757 uint64_t UsesSEHTry : 1;
1758
1759 /// Indicates if the function was a definition
1760 /// but its body was skipped.
1761 LLVM_PREFERRED_TYPE(bool)
1762 uint64_t HasSkippedBody : 1;
1763
1764 /// Indicates if the function declaration will
1765 /// have a body, once we're done parsing it.
1766 LLVM_PREFERRED_TYPE(bool)
1767 uint64_t WillHaveBody : 1;
1768
1769 /// Indicates that this function is a multiversioned
1770 /// function using attribute 'target'.
1771 LLVM_PREFERRED_TYPE(bool)
1772 uint64_t IsMultiVersion : 1;
1773
1774 /// Only used by CXXDeductionGuideDecl. Indicates the kind
1775 /// of the Deduction Guide that is implicitly generated
1776 /// (used during overload resolution).
1777 LLVM_PREFERRED_TYPE(DeductionCandidate)
1778 uint64_t DeductionCandidateKind : 2;
1779
1780 /// Store the ODRHash after first calculation.
1781 LLVM_PREFERRED_TYPE(bool)
1782 uint64_t HasODRHash : 1;
1783
1784 /// Indicates if the function uses Floating Point Constrained Intrinsics
1785 LLVM_PREFERRED_TYPE(bool)
1786 uint64_t UsesFPIntrin : 1;
1787
1788 // Indicates this function is a constrained friend, where the constraint
1789 // refers to an enclosing template for hte purposes of [temp.friend]p9.
1790 LLVM_PREFERRED_TYPE(bool)
1791 uint64_t FriendConstraintRefersToEnclosingTemplate : 1;
1792 };
1793
1794 /// Number of inherited and non-inherited bits in FunctionDeclBitfields.
1795 enum { NumFunctionDeclBits = NumDeclContextBits + 31 };
1796
1797 /// Stores the bits used by CXXConstructorDecl. If modified
1798 /// NumCXXConstructorDeclBits and the accessor
1799 /// methods in CXXConstructorDecl should be updated appropriately.
1800 class CXXConstructorDeclBitfields {
1801 friend class CXXConstructorDecl;
1802 /// For the bits in FunctionDeclBitfields.
1803 LLVM_PREFERRED_TYPE(FunctionDeclBitfields)
1804 uint64_t : NumFunctionDeclBits;
1805
1806 /// 20 bits to fit in the remaining available space.
1807 /// Note that this makes CXXConstructorDeclBitfields take
1808 /// exactly 64 bits and thus the width of NumCtorInitializers
1809 /// will need to be shrunk if some bit is added to NumDeclContextBitfields,
1810 /// NumFunctionDeclBitfields or CXXConstructorDeclBitfields.
1811 uint64_t NumCtorInitializers : 17;
1812 LLVM_PREFERRED_TYPE(bool)
1813 uint64_t IsInheritingConstructor : 1;
1814
1815 /// Whether this constructor has a trail-allocated explicit specifier.
1816 LLVM_PREFERRED_TYPE(bool)
1817 uint64_t HasTrailingExplicitSpecifier : 1;
1818 /// If this constructor does't have a trail-allocated explicit specifier.
1819 /// Whether this constructor is explicit specified.
1820 LLVM_PREFERRED_TYPE(bool)
1821 uint64_t IsSimpleExplicit : 1;
1822 };
1823
1824 /// Number of inherited and non-inherited bits in CXXConstructorDeclBitfields.
1825 enum { NumCXXConstructorDeclBits = NumFunctionDeclBits + 20 };
1826
1827 /// Stores the bits used by ObjCMethodDecl.
1828 /// If modified NumObjCMethodDeclBits and the accessor
1829 /// methods in ObjCMethodDecl should be updated appropriately.
1830 class ObjCMethodDeclBitfields {
1831 friend class ObjCMethodDecl;
1832
1833 /// For the bits in DeclContextBitfields.
1834 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1835 uint64_t : NumDeclContextBits;
1836
1837 /// The conventional meaning of this method; an ObjCMethodFamily.
1838 /// This is not serialized; instead, it is computed on demand and
1839 /// cached.
1840 LLVM_PREFERRED_TYPE(ObjCMethodFamily)
1841 mutable uint64_t Family : ObjCMethodFamilyBitWidth;
1842
1843 /// instance (true) or class (false) method.
1844 LLVM_PREFERRED_TYPE(bool)
1845 uint64_t IsInstance : 1;
1846 LLVM_PREFERRED_TYPE(bool)
1847 uint64_t IsVariadic : 1;
1848
1849 /// True if this method is the getter or setter for an explicit property.
1850 LLVM_PREFERRED_TYPE(bool)
1851 uint64_t IsPropertyAccessor : 1;
1852
1853 /// True if this method is a synthesized property accessor stub.
1854 LLVM_PREFERRED_TYPE(bool)
1855 uint64_t IsSynthesizedAccessorStub : 1;
1856
1857 /// Method has a definition.
1858 LLVM_PREFERRED_TYPE(bool)
1859 uint64_t IsDefined : 1;
1860
1861 /// Method redeclaration in the same interface.
1862 LLVM_PREFERRED_TYPE(bool)
1863 uint64_t IsRedeclaration : 1;
1864
1865 /// Is redeclared in the same interface.
1866 LLVM_PREFERRED_TYPE(bool)
1867 mutable uint64_t HasRedeclaration : 1;
1868
1869 /// \@required/\@optional
1870 LLVM_PREFERRED_TYPE(ObjCImplementationControl)
1871 uint64_t DeclImplementation : 2;
1872
1873 /// in, inout, etc.
1874 LLVM_PREFERRED_TYPE(Decl::ObjCDeclQualifier)
1875 uint64_t objcDeclQualifier : 7;
1876
1877 /// Indicates whether this method has a related result type.
1878 LLVM_PREFERRED_TYPE(bool)
1879 uint64_t RelatedResultType : 1;
1880
1881 /// Whether the locations of the selector identifiers are in a
1882 /// "standard" position, a enum SelectorLocationsKind.
1883 LLVM_PREFERRED_TYPE(SelectorLocationsKind)
1884 uint64_t SelLocsKind : 2;
1885
1886 /// Whether this method overrides any other in the class hierarchy.
1887 ///
1888 /// A method is said to override any method in the class's
1889 /// base classes, its protocols, or its categories' protocols, that has
1890 /// the same selector and is of the same kind (class or instance).
1891 /// A method in an implementation is not considered as overriding the same
1892 /// method in the interface or its categories.
1893 LLVM_PREFERRED_TYPE(bool)
1894 uint64_t IsOverriding : 1;
1895
1896 /// Indicates if the method was a definition but its body was skipped.
1897 LLVM_PREFERRED_TYPE(bool)
1898 uint64_t HasSkippedBody : 1;
1899 };
1900
1901 /// Number of inherited and non-inherited bits in ObjCMethodDeclBitfields.
1902 enum { NumObjCMethodDeclBits = NumDeclContextBits + 24 };
1903
1904 /// Stores the bits used by ObjCContainerDecl.
1905 /// If modified NumObjCContainerDeclBits and the accessor
1906 /// methods in ObjCContainerDecl should be updated appropriately.
1907 class ObjCContainerDeclBitfields {
1908 friend class ObjCContainerDecl;
1909 /// For the bits in DeclContextBitfields
1910 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1911 uint32_t : NumDeclContextBits;
1912
1913 // Not a bitfield but this saves space.
1914 // Note that ObjCContainerDeclBitfields is full.
1915 SourceLocation AtStart;
1916 };
1917
1918 /// Number of inherited and non-inherited bits in ObjCContainerDeclBitfields.
1919 /// Note that here we rely on the fact that SourceLocation is 32 bits
1920 /// wide. We check this with the static_assert in the ctor of DeclContext.
1921 enum { NumObjCContainerDeclBits = 64 };
1922
1923 /// Stores the bits used by LinkageSpecDecl.
1924 /// If modified NumLinkageSpecDeclBits and the accessor
1925 /// methods in LinkageSpecDecl should be updated appropriately.
1926 class LinkageSpecDeclBitfields {
1927 friend class LinkageSpecDecl;
1928 /// For the bits in DeclContextBitfields.
1929 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1930 uint64_t : NumDeclContextBits;
1931
1932 /// The language for this linkage specification.
1933 LLVM_PREFERRED_TYPE(LinkageSpecLanguageIDs)
1934 uint64_t Language : 3;
1935
1936 /// True if this linkage spec has braces.
1937 /// This is needed so that hasBraces() returns the correct result while the
1938 /// linkage spec body is being parsed. Once RBraceLoc has been set this is
1939 /// not used, so it doesn't need to be serialized.
1940 LLVM_PREFERRED_TYPE(bool)
1941 uint64_t HasBraces : 1;
1942 };
1943
1944 /// Number of inherited and non-inherited bits in LinkageSpecDeclBitfields.
1945 enum { NumLinkageSpecDeclBits = NumDeclContextBits + 4 };
1946
1947 /// Stores the bits used by BlockDecl.
1948 /// If modified NumBlockDeclBits and the accessor
1949 /// methods in BlockDecl should be updated appropriately.
1950 class BlockDeclBitfields {
1951 friend class BlockDecl;
1952 /// For the bits in DeclContextBitfields.
1953 LLVM_PREFERRED_TYPE(DeclContextBitfields)
1954 uint64_t : NumDeclContextBits;
1955
1956 LLVM_PREFERRED_TYPE(bool)
1957 uint64_t IsVariadic : 1;
1958 LLVM_PREFERRED_TYPE(bool)
1959 uint64_t CapturesCXXThis : 1;
1960 LLVM_PREFERRED_TYPE(bool)
1961 uint64_t BlockMissingReturnType : 1;
1962 LLVM_PREFERRED_TYPE(bool)
1963 uint64_t IsConversionFromLambda : 1;
1964
1965 /// A bit that indicates this block is passed directly to a function as a
1966 /// non-escaping parameter.
1967 LLVM_PREFERRED_TYPE(bool)
1968 uint64_t DoesNotEscape : 1;
1969
1970 /// A bit that indicates whether it's possible to avoid coying this block to
1971 /// the heap when it initializes or is assigned to a local variable with
1972 /// automatic storage.
1973 LLVM_PREFERRED_TYPE(bool)
1974 uint64_t CanAvoidCopyToHeap : 1;
1975 };
1976
1977 /// Number of inherited and non-inherited bits in BlockDeclBitfields.
1978 enum { NumBlockDeclBits = NumDeclContextBits + 5 };
1979
1980 /// Pointer to the data structure used to lookup declarations
1981 /// within this context (or a DependentStoredDeclsMap if this is a
1982 /// dependent context). We maintain the invariant that, if the map
1983 /// contains an entry for a DeclarationName (and we haven't lazily
1984 /// omitted anything), then it contains all relevant entries for that
1985 /// name (modulo the hasExternalDecls() flag).
1986 mutable StoredDeclsMap *LookupPtr = nullptr;
1987
1988protected:
1989 /// This anonymous union stores the bits belonging to DeclContext and classes
1990 /// deriving from it. The goal is to use otherwise wasted
1991 /// space in DeclContext to store data belonging to derived classes.
1992 /// The space saved is especially significient when pointers are aligned
1993 /// to 8 bytes. In this case due to alignment requirements we have a
1994 /// little less than 8 bytes free in DeclContext which we can use.
1995 /// We check that none of the classes in this union is larger than
1996 /// 8 bytes with static_asserts in the ctor of DeclContext.
1997 union {
1998 DeclContextBitfields DeclContextBits;
1999 TagDeclBitfields TagDeclBits;
2000 EnumDeclBitfields EnumDeclBits;
2001 RecordDeclBitfields RecordDeclBits;
2002 OMPDeclareReductionDeclBitfields OMPDeclareReductionDeclBits;
2003 FunctionDeclBitfields FunctionDeclBits;
2004 CXXConstructorDeclBitfields CXXConstructorDeclBits;
2005 ObjCMethodDeclBitfields ObjCMethodDeclBits;
2006 ObjCContainerDeclBitfields ObjCContainerDeclBits;
2007 LinkageSpecDeclBitfields LinkageSpecDeclBits;
2008 BlockDeclBitfields BlockDeclBits;
2009
2010 static_assert(sizeof(DeclContextBitfields) <= 8,
2011 "DeclContextBitfields is larger than 8 bytes!");
2012 static_assert(sizeof(TagDeclBitfields) <= 8,
2013 "TagDeclBitfields is larger than 8 bytes!");
2014 static_assert(sizeof(EnumDeclBitfields) <= 8,
2015 "EnumDeclBitfields is larger than 8 bytes!");
2016 static_assert(sizeof(RecordDeclBitfields) <= 8,
2017 "RecordDeclBitfields is larger than 8 bytes!");
2018 static_assert(sizeof(OMPDeclareReductionDeclBitfields) <= 8,
2019 "OMPDeclareReductionDeclBitfields is larger than 8 bytes!");
2020 static_assert(sizeof(FunctionDeclBitfields) <= 8,
2021 "FunctionDeclBitfields is larger than 8 bytes!");
2022 static_assert(sizeof(CXXConstructorDeclBitfields) <= 8,
2023 "CXXConstructorDeclBitfields is larger than 8 bytes!");
2024 static_assert(sizeof(ObjCMethodDeclBitfields) <= 8,
2025 "ObjCMethodDeclBitfields is larger than 8 bytes!");
2026 static_assert(sizeof(ObjCContainerDeclBitfields) <= 8,
2027 "ObjCContainerDeclBitfields is larger than 8 bytes!");
2028 static_assert(sizeof(LinkageSpecDeclBitfields) <= 8,
2029 "LinkageSpecDeclBitfields is larger than 8 bytes!");
2030 static_assert(sizeof(BlockDeclBitfields) <= 8,
2031 "BlockDeclBitfields is larger than 8 bytes!");
2032 };
2033
2034 /// FirstDecl - The first declaration stored within this declaration
2035 /// context.
2036 mutable Decl *FirstDecl = nullptr;
2037
2038 /// LastDecl - The last declaration stored within this declaration
2039 /// context. FIXME: We could probably cache this value somewhere
2040 /// outside of the DeclContext, to reduce the size of DeclContext by
2041 /// another pointer.
2042 mutable Decl *LastDecl = nullptr;
2043
2044 /// Build up a chain of declarations.
2045 ///
2046 /// \returns the first/last pair of declarations.
2047 static std::pair<Decl *, Decl *>
2048 BuildDeclChain(ArrayRef<Decl*> Decls, bool FieldsAlreadyLoaded);
2049
2051
2052public:
2054
2055 // For use when debugging; hasValidDeclKind() will always return true for
2056 // a correctly constructed object within its lifetime.
2057 bool hasValidDeclKind() const;
2058
2060 return static_cast<Decl::Kind>(DeclContextBits.DeclKind);
2061 }
2062
2063 const char *getDeclKindName() const;
2064
2065 /// getParent - Returns the containing DeclContext.
2067 return cast<Decl>(this)->getDeclContext();
2068 }
2069 const DeclContext *getParent() const {
2070 return const_cast<DeclContext*>(this)->getParent();
2071 }
2072
2073 /// getLexicalParent - Returns the containing lexical DeclContext. May be
2074 /// different from getParent, e.g.:
2075 ///
2076 /// namespace A {
2077 /// struct S;
2078 /// }
2079 /// struct A::S {}; // getParent() == namespace 'A'
2080 /// // getLexicalParent() == translation unit
2081 ///
2083 return cast<Decl>(this)->getLexicalDeclContext();
2084 }
2086 return const_cast<DeclContext*>(this)->getLexicalParent();
2087 }
2088
2090
2092 return const_cast<DeclContext*>(this)->getLookupParent();
2093 }
2094
2096 return cast<Decl>(this)->getASTContext();
2097 }
2098
2099 bool isClosure() const { return getDeclKind() == Decl::Block; }
2100
2101 /// Return this DeclContext if it is a BlockDecl. Otherwise, return the
2102 /// innermost enclosing BlockDecl or null if there are no enclosing blocks.
2103 const BlockDecl *getInnermostBlockDecl() const;
2104
2105 bool isObjCContainer() const {
2106 switch (getDeclKind()) {
2107 case Decl::ObjCCategory:
2108 case Decl::ObjCCategoryImpl:
2109 case Decl::ObjCImplementation:
2110 case Decl::ObjCInterface:
2111 case Decl::ObjCProtocol:
2112 return true;
2113 default:
2114 return false;
2115 }
2116 }
2117
2118 bool isFunctionOrMethod() const {
2119 switch (getDeclKind()) {
2120 case Decl::Block:
2121 case Decl::Captured:
2122 case Decl::ObjCMethod:
2123 case Decl::TopLevelStmt:
2124 return true;
2125 default:
2126 return getDeclKind() >= Decl::firstFunction &&
2127 getDeclKind() <= Decl::lastFunction;
2128 }
2129 }
2130
2131 /// Test whether the context supports looking up names.
2132 bool isLookupContext() const {
2133 return !isFunctionOrMethod() && getDeclKind() != Decl::LinkageSpec &&
2134 getDeclKind() != Decl::Export;
2135 }
2136
2137 bool isFileContext() const {
2138 return getDeclKind() == Decl::TranslationUnit ||
2139 getDeclKind() == Decl::Namespace;
2140 }
2141
2142 bool isTranslationUnit() const {
2143 return getDeclKind() == Decl::TranslationUnit;
2144 }
2145
2146 bool isRecord() const {
2147 return getDeclKind() >= Decl::firstRecord &&
2148 getDeclKind() <= Decl::lastRecord;
2149 }
2150
2151 bool isNamespace() const { return getDeclKind() == Decl::Namespace; }
2152
2153 bool isStdNamespace() const;
2154
2155 bool isInlineNamespace() const;
2156
2157 /// Determines whether this context is dependent on a
2158 /// template parameter.
2159 bool isDependentContext() const;
2160
2161 /// isTransparentContext - Determines whether this context is a
2162 /// "transparent" context, meaning that the members declared in this
2163 /// context are semantically declared in the nearest enclosing
2164 /// non-transparent (opaque) context but are lexically declared in
2165 /// this context. For example, consider the enumerators of an
2166 /// enumeration type:
2167 /// @code
2168 /// enum E {
2169 /// Val1
2170 /// };
2171 /// @endcode
2172 /// Here, E is a transparent context, so its enumerator (Val1) will
2173 /// appear (semantically) that it is in the same context of E.
2174 /// Examples of transparent contexts include: enumerations (except for
2175 /// C++0x scoped enums), C++ linkage specifications and export declaration.
2176 bool isTransparentContext() const;
2177
2178 /// Determines whether this context or some of its ancestors is a
2179 /// linkage specification context that specifies C linkage.
2180 bool isExternCContext() const;
2181
2182 /// Retrieve the nearest enclosing C linkage specification context.
2183 const LinkageSpecDecl *getExternCContext() const;
2184
2185 /// Determines whether this context or some of its ancestors is a
2186 /// linkage specification context that specifies C++ linkage.
2187 bool isExternCXXContext() const;
2188
2189 /// Determine whether this declaration context is equivalent
2190 /// to the declaration context DC.
2191 bool Equals(const DeclContext *DC) const {
2192 return DC && this->getPrimaryContext() == DC->getPrimaryContext();
2193 }
2194
2195 /// Determine whether this declaration context encloses the
2196 /// declaration context DC.
2197 bool Encloses(const DeclContext *DC) const;
2198
2199 /// Find the nearest non-closure ancestor of this context,
2200 /// i.e. the innermost semantic parent of this context which is not
2201 /// a closure. A context may be its own non-closure ancestor.
2204 return const_cast<DeclContext*>(this)->getNonClosureAncestor();
2205 }
2206
2207 // Retrieve the nearest context that is not a transparent context.
2210 return const_cast<DeclContext *>(this)->getNonTransparentContext();
2211 }
2212
2213 /// getPrimaryContext - There may be many different
2214 /// declarations of the same entity (including forward declarations
2215 /// of classes, multiple definitions of namespaces, etc.), each with
2216 /// a different set of declarations. This routine returns the
2217 /// "primary" DeclContext structure, which will contain the
2218 /// information needed to perform name lookup into this context.
2221 return const_cast<DeclContext*>(this)->getPrimaryContext();
2222 }
2223
2224 /// getRedeclContext - Retrieve the context in which an entity conflicts with
2225 /// other entities of the same name, or where it is a redeclaration if the
2226 /// two entities are compatible. This skips through transparent contexts.
2229 return const_cast<DeclContext *>(this)->getRedeclContext();
2230 }
2231
2232 /// Retrieve the nearest enclosing namespace context.
2235 return const_cast<DeclContext *>(this)->getEnclosingNamespaceContext();
2236 }
2237
2238 /// Retrieve the outermost lexically enclosing record context.
2241 return const_cast<DeclContext *>(this)->getOuterLexicalRecordContext();
2242 }
2243
2244 /// Test if this context is part of the enclosing namespace set of
2245 /// the context NS, as defined in C++0x [namespace.def]p9. If either context
2246 /// isn't a namespace, this is equivalent to Equals().
2247 ///
2248 /// The enclosing namespace set of a namespace is the namespace and, if it is
2249 /// inline, its enclosing namespace, recursively.
2250 bool InEnclosingNamespaceSetOf(const DeclContext *NS) const;
2251
2252 /// Collects all of the declaration contexts that are semantically
2253 /// connected to this declaration context.
2254 ///
2255 /// For declaration contexts that have multiple semantically connected but
2256 /// syntactically distinct contexts, such as C++ namespaces, this routine
2257 /// retrieves the complete set of such declaration contexts in source order.
2258 /// For example, given:
2259 ///
2260 /// \code
2261 /// namespace N {
2262 /// int x;
2263 /// }
2264 /// namespace N {
2265 /// int y;
2266 /// }
2267 /// \endcode
2268 ///
2269 /// The \c Contexts parameter will contain both definitions of N.
2270 ///
2271 /// \param Contexts Will be cleared and set to the set of declaration
2272 /// contexts that are semanticaly connected to this declaration context,
2273 /// in source order, including this context (which may be the only result,
2274 /// for non-namespace contexts).
2276
2277 /// decl_iterator - Iterates through the declarations stored
2278 /// within this context.
2280 /// Current - The current declaration.
2281 Decl *Current = nullptr;
2282
2283 public:
2284 using value_type = Decl *;
2285 using reference = const value_type &;
2286 using pointer = const value_type *;
2287 using iterator_category = std::forward_iterator_tag;
2288 using difference_type = std::ptrdiff_t;
2289
2290 decl_iterator() = default;
2291 explicit decl_iterator(Decl *C) : Current(C) {}
2292
2293 reference operator*() const { return Current; }
2294
2295 // This doesn't meet the iterator requirements, but it's convenient
2296 value_type operator->() const { return Current; }
2297
2299 Current = Current->getNextDeclInContext();
2300 return *this;
2301 }
2302
2304 decl_iterator tmp(*this);
2305 ++(*this);
2306 return tmp;
2307 }
2308
2310 return x.Current == y.Current;
2311 }
2312
2314 return x.Current != y.Current;
2315 }
2316 };
2317
2318 using decl_range = llvm::iterator_range<decl_iterator>;
2319
2320 /// decls_begin/decls_end - Iterate over the declarations stored in
2321 /// this context.
2323 decl_iterator decls_begin() const;
2325 bool decls_empty() const;
2326
2327 /// noload_decls_begin/end - Iterate over the declarations stored in this
2328 /// context that are currently loaded; don't attempt to retrieve anything
2329 /// from an external source.
2332 }
2335
2336 /// specific_decl_iterator - Iterates over a subrange of
2337 /// declarations stored in a DeclContext, providing only those that
2338 /// are of type SpecificDecl (or a class derived from it). This
2339 /// iterator is used, for example, to provide iteration over just
2340 /// the fields within a RecordDecl (with SpecificDecl = FieldDecl).
2341 template<typename SpecificDecl>
2343 /// Current - The current, underlying declaration iterator, which
2344 /// will either be NULL or will point to a declaration of
2345 /// type SpecificDecl.
2347
2348 /// SkipToNextDecl - Advances the current position up to the next
2349 /// declaration of type SpecificDecl that also meets the criteria
2350 /// required by Acceptable.
2351 void SkipToNextDecl() {
2352 while (*Current && !isa<SpecificDecl>(*Current))
2353 ++Current;
2354 }
2355
2356 public:
2357 using value_type = SpecificDecl *;
2358 // TODO: Add reference and pointer types (with some appropriate proxy type)
2359 // if we ever have a need for them.
2360 using reference = void;
2361 using pointer = void;
2363 std::iterator_traits<DeclContext::decl_iterator>::difference_type;
2364 using iterator_category = std::forward_iterator_tag;
2365
2367
2368 /// specific_decl_iterator - Construct a new iterator over a
2369 /// subset of the declarations the range [C,
2370 /// end-of-declarations). If A is non-NULL, it is a pointer to a
2371 /// member function of SpecificDecl that should return true for
2372 /// all of the SpecificDecl instances that will be in the subset
2373 /// of iterators. For example, if you want Objective-C instance
2374 /// methods, SpecificDecl will be ObjCMethodDecl and A will be
2375 /// &ObjCMethodDecl::isInstanceMethod.
2377 SkipToNextDecl();
2378 }
2379
2380 value_type operator*() const { return cast<SpecificDecl>(*Current); }
2381
2382 // This doesn't meet the iterator requirements, but it's convenient
2383 value_type operator->() const { return **this; }
2384
2386 ++Current;
2387 SkipToNextDecl();
2388 return *this;
2389 }
2390
2392 specific_decl_iterator tmp(*this);
2393 ++(*this);
2394 return tmp;
2395 }
2396
2398 const specific_decl_iterator& y) {
2399 return x.Current == y.Current;
2400 }
2401
2403 const specific_decl_iterator& y) {
2404 return x.Current != y.Current;
2405 }
2406 };
2407
2408 /// Iterates over a filtered subrange of declarations stored
2409 /// in a DeclContext.
2410 ///
2411 /// This iterator visits only those declarations that are of type
2412 /// SpecificDecl (or a class derived from it) and that meet some
2413 /// additional run-time criteria. This iterator is used, for
2414 /// example, to provide access to the instance methods within an
2415 /// Objective-C interface (with SpecificDecl = ObjCMethodDecl and
2416 /// Acceptable = ObjCMethodDecl::isInstanceMethod).
2417 template<typename SpecificDecl, bool (SpecificDecl::*Acceptable)() const>
2419 /// Current - The current, underlying declaration iterator, which
2420 /// will either be NULL or will point to a declaration of
2421 /// type SpecificDecl.
2423
2424 /// SkipToNextDecl - Advances the current position up to the next
2425 /// declaration of type SpecificDecl that also meets the criteria
2426 /// required by Acceptable.
2427 void SkipToNextDecl() {
2428 while (*Current &&
2429 (!isa<SpecificDecl>(*Current) ||
2430 (Acceptable && !(cast<SpecificDecl>(*Current)->*Acceptable)())))
2431 ++Current;
2432 }
2433
2434 public:
2435 using value_type = SpecificDecl *;
2436 // TODO: Add reference and pointer types (with some appropriate proxy type)
2437 // if we ever have a need for them.
2438 using reference = void;
2439 using pointer = void;
2441 std::iterator_traits<DeclContext::decl_iterator>::difference_type;
2442 using iterator_category = std::forward_iterator_tag;
2443
2445
2446 /// filtered_decl_iterator - Construct a new iterator over a
2447 /// subset of the declarations the range [C,
2448 /// end-of-declarations). If A is non-NULL, it is a pointer to a
2449 /// member function of SpecificDecl that should return true for
2450 /// all of the SpecificDecl instances that will be in the subset
2451 /// of iterators. For example, if you want Objective-C instance
2452 /// methods, SpecificDecl will be ObjCMethodDecl and A will be
2453 /// &ObjCMethodDecl::isInstanceMethod.
2455 SkipToNextDecl();
2456 }
2457
2458 value_type operator*() const { return cast<SpecificDecl>(*Current); }
2459 value_type operator->() const { return cast<SpecificDecl>(*Current); }
2460
2462 ++Current;
2463 SkipToNextDecl();
2464 return *this;
2465 }
2466
2468 filtered_decl_iterator tmp(*this);
2469 ++(*this);
2470 return tmp;
2471 }
2472
2474 const filtered_decl_iterator& y) {
2475 return x.Current == y.Current;
2476 }
2477
2479 const filtered_decl_iterator& y) {
2480 return x.Current != y.Current;
2481 }
2482 };
2483
2484 /// Add the declaration D into this context.
2485 ///
2486 /// This routine should be invoked when the declaration D has first
2487 /// been declared, to place D into the context where it was
2488 /// (lexically) defined. Every declaration must be added to one
2489 /// (and only one!) context, where it can be visited via
2490 /// [decls_begin(), decls_end()). Once a declaration has been added
2491 /// to its lexical context, the corresponding DeclContext owns the
2492 /// declaration.
2493 ///
2494 /// If D is also a NamedDecl, it will be made visible within its
2495 /// semantic context via makeDeclVisibleInContext.
2496 void addDecl(Decl *D);
2497
2498 /// Add the declaration D into this context, but suppress
2499 /// searches for external declarations with the same name.
2500 ///
2501 /// Although analogous in function to addDecl, this removes an
2502 /// important check. This is only useful if the Decl is being
2503 /// added in response to an external search; in all other cases,
2504 /// addDecl() is the right function to use.
2505 /// See the ASTImporter for use cases.
2506 void addDeclInternal(Decl *D);
2507
2508 /// Add the declaration D to this context without modifying
2509 /// any lookup tables.
2510 ///
2511 /// This is useful for some operations in dependent contexts where
2512 /// the semantic context might not be dependent; this basically
2513 /// only happens with friends.
2514 void addHiddenDecl(Decl *D);
2515
2516 /// Removes a declaration from this context.
2517 void removeDecl(Decl *D);
2518
2519 /// Checks whether a declaration is in this context.
2520 bool containsDecl(Decl *D) const;
2521
2522 /// Checks whether a declaration is in this context.
2523 /// This also loads the Decls from the external source before the check.
2524 bool containsDeclAndLoad(Decl *D) const;
2525
2528
2529 /// lookup - Find the declarations (if any) with the given Name in
2530 /// this context. Returns a range of iterators that contains all of
2531 /// the declarations with this name, with object, function, member,
2532 /// and enumerator names preceding any tag name. Note that this
2533 /// routine will not look into parent contexts.
2535
2536 /// Find the declarations with the given name that are visible
2537 /// within this context; don't attempt to retrieve anything from an
2538 /// external source.
2540
2541 /// A simplistic name lookup mechanism that performs name lookup
2542 /// into this declaration context without consulting the external source.
2543 ///
2544 /// This function should almost never be used, because it subverts the
2545 /// usual relationship between a DeclContext and the external source.
2546 /// See the ASTImporter for the (few, but important) use cases.
2547 ///
2548 /// FIXME: This is very inefficient; replace uses of it with uses of
2549 /// noload_lookup.
2552
2553 /// Makes a declaration visible within this context.
2554 ///
2555 /// This routine makes the declaration D visible to name lookup
2556 /// within this context and, if this is a transparent context,
2557 /// within its parent contexts up to the first enclosing
2558 /// non-transparent context. Making a declaration visible within a
2559 /// context does not transfer ownership of a declaration, and a
2560 /// declaration can be visible in many contexts that aren't its
2561 /// lexical context.
2562 ///
2563 /// If D is a redeclaration of an existing declaration that is
2564 /// visible from this context, as determined by
2565 /// NamedDecl::declarationReplaces, the previous declaration will be
2566 /// replaced with D.
2568
2569 /// all_lookups_iterator - An iterator that provides a view over the results
2570 /// of looking up every possible name.
2572
2573 using lookups_range = llvm::iterator_range<all_lookups_iterator>;
2574
2575 lookups_range lookups() const;
2576 // Like lookups(), but avoids loading external declarations.
2577 // If PreserveInternalState, avoids building lookup data structures too.
2578 lookups_range noload_lookups(bool PreserveInternalState) const;
2579
2580 /// Iterators over all possible lookups within this context.
2583
2584 /// Iterators over all possible lookups within this context that are
2585 /// currently loaded; don't attempt to retrieve anything from an external
2586 /// source.
2589
2590 struct udir_iterator;
2591
2593 llvm::iterator_adaptor_base<udir_iterator, lookup_iterator,
2596
2599
2601 };
2602
2603 using udir_range = llvm::iterator_range<udir_iterator>;
2604
2606
2607 // These are all defined in DependentDiagnostic.h.
2608 class ddiag_iterator;
2609
2610 using ddiag_range = llvm::iterator_range<DeclContext::ddiag_iterator>;
2611
2612 inline ddiag_range ddiags() const;
2613
2614 // Low-level accessors
2615
2616 /// Mark that there are external lexical declarations that we need
2617 /// to include in our lookup table (and that are not available as external
2618 /// visible lookups). These extra lookup results will be found by walking
2619 /// the lexical declarations of this context. This should be used only if
2620 /// setHasExternalLexicalStorage() has been called on any decl context for
2621 /// which this is the primary context.
2623 assert(this == getPrimaryContext() &&
2624 "should only be called on primary context");
2625 DeclContextBits.HasLazyExternalLexicalLookups = true;
2626 }
2627
2628 /// Retrieve the internal representation of the lookup structure.
2629 /// This may omit some names if we are lazily building the structure.
2630 StoredDeclsMap *getLookupPtr() const { return LookupPtr; }
2631
2632 /// Ensure the lookup structure is fully-built and return it.
2634
2635 /// Whether this DeclContext has external storage containing
2636 /// additional declarations that are lexically in this context.
2638 return DeclContextBits.ExternalLexicalStorage;
2639 }
2640
2641 /// State whether this DeclContext has external storage for
2642 /// declarations lexically in this context.
2643 void setHasExternalLexicalStorage(bool ES = true) const {
2644 DeclContextBits.ExternalLexicalStorage = ES;
2645 }
2646
2647 /// Whether this DeclContext has external storage containing
2648 /// additional declarations that are visible in this context.
2650 return DeclContextBits.ExternalVisibleStorage;
2651 }
2652
2653 /// State whether this DeclContext has external storage for
2654 /// declarations visible in this context.
2655 void setHasExternalVisibleStorage(bool ES = true) const {
2656 DeclContextBits.ExternalVisibleStorage = ES;
2657 if (ES && LookupPtr)
2658 DeclContextBits.NeedToReconcileExternalVisibleStorage = true;
2659 }
2660
2661 /// Determine whether the given declaration is stored in the list of
2662 /// declarations lexically within this context.
2663 bool isDeclInLexicalTraversal(const Decl *D) const {
2664 return D && (D->NextInContextAndBits.getPointer() || D == FirstDecl ||
2665 D == LastDecl);
2666 }
2667
2668 void setUseQualifiedLookup(bool use = true) const {
2669 DeclContextBits.UseQualifiedLookup = use;
2670 }
2671
2673 return DeclContextBits.UseQualifiedLookup;
2674 }
2675
2676 static bool classof(const Decl *D);
2677 static bool classof(const DeclContext *D) { return true; }
2678
2679 void dumpAsDecl() const;
2680 void dumpAsDecl(const ASTContext *Ctx) const;
2681 void dumpDeclContext() const;
2682 void dumpLookups() const;
2683 void dumpLookups(llvm::raw_ostream &OS, bool DumpDecls = false,
2684 bool Deserialize = false) const;
2685
2686private:
2687 /// Whether this declaration context has had externally visible
2688 /// storage added since the last lookup. In this case, \c LookupPtr's
2689 /// invariant may not hold and needs to be fixed before we perform
2690 /// another lookup.
2691 bool hasNeedToReconcileExternalVisibleStorage() const {
2692 return DeclContextBits.NeedToReconcileExternalVisibleStorage;
2693 }
2694
2695 /// State that this declaration context has had externally visible
2696 /// storage added since the last lookup. In this case, \c LookupPtr's
2697 /// invariant may not hold and needs to be fixed before we perform
2698 /// another lookup.
2699 void setNeedToReconcileExternalVisibleStorage(bool Need = true) const {
2700 DeclContextBits.NeedToReconcileExternalVisibleStorage = Need;
2701 }
2702
2703 /// If \c true, this context may have local lexical declarations
2704 /// that are missing from the lookup table.
2705 bool hasLazyLocalLexicalLookups() const {
2706 return DeclContextBits.HasLazyLocalLexicalLookups;
2707 }
2708
2709 /// If \c true, this context may have local lexical declarations
2710 /// that are missing from the lookup table.
2711 void setHasLazyLocalLexicalLookups(bool HasLLLL = true) const {
2712 DeclContextBits.HasLazyLocalLexicalLookups = HasLLLL;
2713 }
2714
2715 /// If \c true, the external source may have lexical declarations
2716 /// that are missing from the lookup table.
2717 bool hasLazyExternalLexicalLookups() const {
2718 return DeclContextBits.HasLazyExternalLexicalLookups;
2719 }
2720
2721 /// If \c true, the external source may have lexical declarations
2722 /// that are missing from the lookup table.
2723 void setHasLazyExternalLexicalLookups(bool HasLELL = true) const {
2724 DeclContextBits.HasLazyExternalLexicalLookups = HasLELL;
2725 }
2726
2727 void reconcileExternalVisibleStorage() const;
2728 bool LoadLexicalDeclsFromExternalStorage() const;
2729
2730 StoredDeclsMap *CreateStoredDeclsMap(ASTContext &C) const;
2731
2732 void loadLazyLocalLexicalLookups();
2733 void buildLookupImpl(DeclContext *DCtx, bool Internal);
2734 void makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal,
2735 bool Rediscoverable);
2736 void makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal);
2737};
2738
2739inline bool Decl::isTemplateParameter() const {
2740 return getKind() == TemplateTypeParm || getKind() == NonTypeTemplateParm ||
2741 getKind() == TemplateTemplateParm;
2742}
2743
2744// Specialization selected when ToTy is not a known subclass of DeclContext.
2745template <class ToTy,
2746 bool IsKnownSubtype = ::std::is_base_of<DeclContext, ToTy>::value>
2748 static const ToTy *doit(const DeclContext *Val) {
2749 return static_cast<const ToTy*>(Decl::castFromDeclContext(Val));
2750 }
2751
2752 static ToTy *doit(DeclContext *Val) {
2753 return static_cast<ToTy*>(Decl::castFromDeclContext(Val));
2754 }
2755};
2756
2757// Specialization selected when ToTy is a known subclass of DeclContext.
2758template <class ToTy>
2760 static const ToTy *doit(const DeclContext *Val) {
2761 return static_cast<const ToTy*>(Val);
2762 }
2763
2764 static ToTy *doit(DeclContext *Val) {
2765 return static_cast<ToTy*>(Val);
2766 }
2767};
2768
2769} // namespace clang
2770
2771namespace llvm {
2772
2773/// isa<T>(DeclContext*)
2774template <typename To>
2775struct isa_impl<To, ::clang::DeclContext> {
2776 static bool doit(const ::clang::DeclContext &Val) {
2777 return To::classofKind(Val.getDeclKind());
2778 }
2779};
2780
2781/// cast<T>(DeclContext*)
2782template<class ToTy>
2783struct cast_convert_val<ToTy,
2785 static const ToTy &doit(const ::clang::DeclContext &Val) {
2787 }
2788};
2789
2790template<class ToTy>
2791struct cast_convert_val<ToTy, ::clang::DeclContext, ::clang::DeclContext> {
2792 static ToTy &doit(::clang::DeclContext &Val) {
2794 }
2795};
2796
2797template<class ToTy>
2798struct cast_convert_val<ToTy,
2799 const ::clang::DeclContext*, const ::clang::DeclContext*> {
2800 static const ToTy *doit(const ::clang::DeclContext *Val) {
2801 return ::clang::cast_convert_decl_context<ToTy>::doit(Val);
2802 }
2803};
2804
2805template<class ToTy>
2806struct cast_convert_val<ToTy, ::clang::DeclContext*, ::clang::DeclContext*> {
2807 static ToTy *doit(::clang::DeclContext *Val) {
2808 return ::clang::cast_convert_decl_context<ToTy>::doit(Val);
2809 }
2810};
2811
2812/// Implement cast_convert_val for Decl -> DeclContext conversions.
2813template<class FromTy>
2814struct cast_convert_val< ::clang::DeclContext, FromTy, FromTy> {
2815 static ::clang::DeclContext &doit(const FromTy &Val) {
2816 return *FromTy::castToDeclContext(&Val);
2817 }
2818};
2819
2820template<class FromTy>
2821struct cast_convert_val< ::clang::DeclContext, FromTy*, FromTy*> {
2822 static ::clang::DeclContext *doit(const FromTy *Val) {
2823 return FromTy::castToDeclContext(Val);
2824 }
2825};
2826
2827template<class FromTy>
2828struct cast_convert_val< const ::clang::DeclContext, FromTy, FromTy> {
2829 static const ::clang::DeclContext &doit(const FromTy &Val) {
2830 return *FromTy::castToDeclContext(&Val);
2831 }
2832};
2833
2834template<class FromTy>
2835struct cast_convert_val< const ::clang::DeclContext, FromTy*, FromTy*> {
2836 static const ::clang::DeclContext *doit(const FromTy *Val) {
2837 return FromTy::castToDeclContext(Val);
2838 }
2839};
2840
2841} // namespace llvm
2842
2843#endif // LLVM_CLANG_AST_DECLBASE_H
#define V(N, I)
Definition: ASTContext.h:3284
NodeId Parent
Definition: ASTDiff.cpp:191
DynTypedNode Node
StringRef P
static char ID
Definition: Arena.cpp:183
#define SM(sm)
Definition: Cuda.cpp:82
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
#define X(type, name)
Definition: Value.h:143
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
SourceLocation Begin
__device__ int
__PTRDIFF_TYPE__ ptrdiff_t
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:182
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Reads an AST files chain containing the contents of a translation unit.
Definition: ASTReader.h:366
Writes an AST file containing the contents of a translation unit.
Definition: ASTWriter.h:86
Attr - This represents one attribute.
Definition: Attr.h:42
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4495
The results of name lookup within a DeclContext.
Definition: DeclBase.h:1369
reference front() const
Definition: DeclBase.h:1392
DeclContextLookupResult(Decls Result)
Definition: DeclBase.h:1377
const_iterator begin() const
Definition: DeclBase.h:1385
DeclListNode::iterator iterator
Definition: DeclBase.h:1379
const_iterator end() const
Definition: DeclBase.h:1388
all_lookups_iterator - An iterator that provides a view over the results of looking up every possible...
Definition: DeclLookups.h:28
An iterator over the dependent diagnostics in a dependent context.
decl_iterator - Iterates through the declarations stored within this context.
Definition: DeclBase.h:2279
std::forward_iterator_tag iterator_category
Definition: DeclBase.h:2287
decl_iterator operator++(int)
Definition: DeclBase.h:2303
value_type operator->() const
Definition: DeclBase.h:2296
friend bool operator!=(decl_iterator x, decl_iterator y)
Definition: DeclBase.h:2313
friend bool operator==(decl_iterator x, decl_iterator y)
Definition: DeclBase.h:2309
decl_iterator & operator++()
Definition: DeclBase.h:2298
Iterates over a filtered subrange of declarations stored in a DeclContext.
Definition: DeclBase.h:2418
std::forward_iterator_tag iterator_category
Definition: DeclBase.h:2442
filtered_decl_iterator(DeclContext::decl_iterator C)
filtered_decl_iterator - Construct a new iterator over a subset of the declarations the range [C,...
Definition: DeclBase.h:2454
friend bool operator==(const filtered_decl_iterator &x, const filtered_decl_iterator &y)
Definition: DeclBase.h:2473
filtered_decl_iterator operator++(int)
Definition: DeclBase.h:2467
friend bool operator!=(const filtered_decl_iterator &x, const filtered_decl_iterator &y)
Definition: DeclBase.h:2478
std::iterator_traits< DeclContext::decl_iterator >::difference_type difference_type
Definition: DeclBase.h:2441
filtered_decl_iterator & operator++()
Definition: DeclBase.h:2461
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition: DeclBase.h:2342
specific_decl_iterator(DeclContext::decl_iterator C)
specific_decl_iterator - Construct a new iterator over a subset of the declarations the range [C,...
Definition: DeclBase.h:2376
friend bool operator==(const specific_decl_iterator &x, const specific_decl_iterator &y)
Definition: DeclBase.h:2397
std::forward_iterator_tag iterator_category
Definition: DeclBase.h:2364
specific_decl_iterator operator++(int)
Definition: DeclBase.h:2391
friend bool operator!=(const specific_decl_iterator &x, const specific_decl_iterator &y)
Definition: DeclBase.h:2402
specific_decl_iterator & operator++()
Definition: DeclBase.h:2385
std::iterator_traits< DeclContext::decl_iterator >::difference_type difference_type
Definition: DeclBase.h:2363
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:2066
udir_range using_directives() const
Returns iterator range [First, Last) of UsingDirectiveDecls stored within this context.
Definition: DeclBase.cpp:2072
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition: DeclBase.h:2191
lookup_result::iterator lookup_iterator
Definition: DeclBase.h:2527
void dumpAsDecl() const
Definition: ASTDumper.cpp:245
FunctionDeclBitfields FunctionDeclBits
Definition: DeclBase.h:2003
bool isFileContext() const
Definition: DeclBase.h:2137
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
Definition: DeclBase.h:2655
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
Definition: DeclBase.cpp:1975
all_lookups_iterator noload_lookups_begin() const
Iterators over all possible lookups within this context that are currently loaded; don't attempt to r...
void dumpLookups(llvm::raw_ostream &OS, bool DumpDecls=false, bool Deserialize=false) const
static std::pair< Decl *, Decl * > BuildDeclChain(ArrayRef< Decl * > Decls, bool FieldsAlreadyLoaded)
Build up a chain of declarations.
Definition: DeclBase.cpp:1455
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Definition: DeclBase.cpp:1298
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
Definition: DeclBase.cpp:1177
bool isObjCContainer() const
Definition: DeclBase.h:2105
ObjCMethodDeclBitfields ObjCMethodDeclBits
Definition: DeclBase.h:2005
TagDeclBitfields TagDeclBits
Definition: DeclBase.h:1999
ASTContext & getParentASTContext() const
Definition: DeclBase.h:2095
lookups_range noload_lookups(bool PreserveInternalState) const
Definition: DeclLookups.h:89
const DeclContext * getParent() const
Definition: DeclBase.h:2069
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1330
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
Definition: DeclBase.cpp:1264
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
Definition: DeclBase.cpp:1957
const DeclContext * getRedeclContext() const
Definition: DeclBase.h:2228
EnumDeclBitfields EnumDeclBits
Definition: DeclBase.h:2000
CXXConstructorDeclBitfields CXXConstructorDeclBits
Definition: DeclBase.h:2004
bool isClosure() const
Definition: DeclBase.h:2099
static bool classof(const DeclContext *D)
Definition: DeclBase.h:2677
const Decl * getNonClosureAncestor() const
Definition: DeclBase.h:2203
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
Definition: DeclBase.h:2082
bool isNamespace() const
Definition: DeclBase.h:2151
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
Definition: DeclBase.cpp:1784
void dumpLookups() const
Definition: ASTDumper.cpp:270
bool isLookupContext() const
Test whether the context supports looking up names.
Definition: DeclBase.h:2132
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
Definition: DeclBase.cpp:1231
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
Definition: DeclBase.h:2649
const DeclContext * getPrimaryContext() const
Definition: DeclBase.h:2220
ObjCContainerDeclBitfields ObjCContainerDeclBits
Definition: DeclBase.h:2006
const char * getDeclKindName() const
Definition: DeclBase.cpp:164
BlockDeclBitfields BlockDeclBits
Definition: DeclBase.h:2008
bool isTranslationUnit() const
Definition: DeclBase.h:2142
bool isRecord() const
Definition: DeclBase.h:2146
void collectAllContexts(SmallVectorImpl< DeclContext * > &Contexts)
Collects all of the declaration contexts that are semantically connected to this declaration context.
Definition: DeclBase.cpp:1441
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
Definition: DeclBase.cpp:1920
llvm::iterator_range< udir_iterator > udir_range
Definition: DeclBase.h:2603
all_lookups_iterator lookups_end() const
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
Definition: DeclBase.h:2622
RecordDeclBitfields RecordDeclBits
Definition: DeclBase.h:2001
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
Definition: DeclBase.h:2036
decl_iterator noload_decls_begin() const
Definition: DeclBase.h:2333
void addDeclInternal(Decl *D)
Add the declaration D into this context, but suppress searches for external declarations with the sam...
Definition: DeclBase.cpp:1706
lookups_range lookups() const
Definition: DeclLookups.h:75
const DeclContext * getLookupParent() const
Definition: DeclBase.h:2091
bool shouldUseQualifiedLookup() const
Definition: DeclBase.h:2672
bool containsDeclAndLoad(Decl *D) const
Checks whether a declaration is in this context.
Definition: DeclBase.cpp:1572
void removeDecl(Decl *D)
Removes a declaration from this context.
Definition: DeclBase.cpp:1617
void addDecl(Decl *D)
Add the declaration D into this context.
Definition: DeclBase.cpp:1698
llvm::iterator_range< decl_iterator > decl_range
Definition: DeclBase.h:2318
void dumpDeclContext() const
StoredDeclsMap * buildLookup()
Ensure the lookup structure is fully-built and return it.
Definition: DeclBase.cpp:1721
decl_iterator decls_end() const
Definition: DeclBase.h:2324
bool hasValidDeclKind() const
Definition: DeclBase.cpp:155
bool isStdNamespace() const
Definition: DeclBase.cpp:1248
ddiag_range ddiags() const
llvm::iterator_adaptor_base< udir_iterator, lookup_iterator, typename lookup_iterator::iterator_category, UsingDirectiveDecl * > udir_iterator_base
Definition: DeclBase.h:2595
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
Definition: DeclBase.cpp:1849
static bool classof(const Decl *D)
Definition: DeclBase.cpp:1195
const DeclContext * getNonTransparentContext() const
Definition: DeclBase.h:2209
const RecordDecl * getOuterLexicalRecordContext() const
Definition: DeclBase.h:2240
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
Definition: DeclBase.cpp:1567
llvm::iterator_range< DeclContext::ddiag_iterator > ddiag_range
Definition: DeclBase.h:2610
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition: DeclBase.h:2637
void setUseQualifiedLookup(bool use=true) const
Definition: DeclBase.h:2668
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
Definition: DeclBase.cpp:1938
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
Definition: DeclBase.h:2042
all_lookups_iterator lookups_begin() const
Iterators over all possible lookups within this context.
llvm::iterator_range< all_lookups_iterator > lookups_range
Definition: DeclBase.h:2573
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
Definition: DeclBase.h:2330
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
Definition: DeclBase.cpp:1354
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
Definition: DeclBase.cpp:1946
const DeclContext * getEnclosingNamespaceContext() const
Definition: DeclBase.h:2234
bool decls_empty() const
Definition: DeclBase.cpp:1560
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition: DeclBase.h:2322
bool isInlineNamespace() const
Definition: DeclBase.cpp:1243
DeclContextBitfields DeclContextBits
Definition: DeclBase.h:1998
bool isFunctionOrMethod() const
Definition: DeclBase.h:2118
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition: DeclBase.h:2643
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
Definition: DeclBase.cpp:1215
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1315
all_lookups_iterator noload_lookups_end() const
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
Definition: DeclBase.cpp:1319
LinkageSpecDeclBitfields LinkageSpecDeclBits
Definition: DeclBase.h:2007
decl_iterator noload_decls_end() const
Definition: DeclBase.h:2334
StoredDeclsMap * getLookupPtr() const
Retrieve the internal representation of the lookup structure.
Definition: DeclBase.h:2630
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context encloses the declaration context DC.
Definition: DeclBase.cpp:1334
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
Definition: DeclBase.cpp:1672
void localUncachedLookup(DeclarationName Name, SmallVectorImpl< NamedDecl * > &Results)
A simplistic name lookup mechanism that performs name lookup into this declaration context without co...
Definition: DeclBase.cpp:1881
OMPDeclareReductionDeclBitfields OMPDeclareReductionDeclBits
Definition: DeclBase.h:2002
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
Definition: DeclBase.h:2663
Decl::Kind getDeclKind() const
Definition: DeclBase.h:2059
DeclContext * getNonTransparentContext()
Definition: DeclBase.cpp:1345
decl_iterator decls_begin() const
Definition: DeclBase.cpp:1554
const DeclContext * getLexicalParent() const
Definition: DeclBase.h:2085
std::forward_iterator_tag iterator_category
Definition: DeclBase.h:1332
reference operator*() const
Definition: DeclBase.h:1336
bool operator==(const iterator &X) const
Definition: DeclBase.h:1343
bool operator!=(const iterator &X) const
Definition: DeclBase.h:1344
A list storing NamedDecls in the lookup tables.
Definition: DeclBase.h:1316
llvm::PointerUnion< NamedDecl *, DeclListNode * > Decls
Definition: DeclBase.h:1320
Iterates through all the redeclarations of the same decl.
Definition: DeclBase.h:993
friend bool operator!=(redecl_iterator x, redecl_iterator y)
Definition: DeclBase.h:1030
value_type operator->() const
Definition: DeclBase.h:1009
redecl_iterator & operator++()
Definition: DeclBase.h:1011
redecl_iterator operator++(int)
Definition: DeclBase.h:1020
friend bool operator==(redecl_iterator x, redecl_iterator y)
Definition: DeclBase.h:1026
std::ptrdiff_t difference_type
Definition: DeclBase.h:1003
reference operator*() const
Definition: DeclBase.h:1008
std::forward_iterator_tag iterator_category
Definition: DeclBase.h:1002
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Decl()=delete
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition: DeclBase.h:1051
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition: DeclBase.h:1066
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
Definition: DeclBase.cpp:295
bool isInStdNamespace() const
Definition: DeclBase.cpp:403
unsigned CacheValidAndLinkage
If 0, we have not computed the linkage of this declaration.
Definition: DeclBase.h:351
SourceLocation getEndLoc() const LLVM_READONLY
Definition: DeclBase.h:441
Decl(Decl &&)=delete
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Definition: DeclBase.h:648
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
Definition: DeclBase.cpp:239
unsigned getOwningModuleID() const
Retrieve the global ID of the module that owns this particular declaration.
Definition: DeclBase.h:788
bool isTemplateDecl() const
returns true if this declaration is a template
Definition: DeclBase.cpp:235
static void add(Kind k)
Definition: DeclBase.cpp:202
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition: DeclBase.h:1216
bool isFunctionOrFunctionTemplate() const
Whether this declaration is a function or function template.
Definition: DeclBase.h:1109
T * getAttr() const
Definition: DeclBase.h:579
bool hasAttrs() const
Definition: DeclBase.h:524
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:501
void addAttr(Attr *A)
Definition: DeclBase.cpp:975
attr_iterator attr_end() const
Definition: DeclBase.h:548
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition: DeclBase.h:599
void setAttrs(const AttrVec &Attrs)
Definition: DeclBase.h:526
void dropAttrs()
Definition: DeclBase.h:552
bool isUnavailable(std::string *Message=nullptr) const
Determine whether this declaration is marked 'unavailable'.
Definition: DeclBase.h:754
bool hasLocalOwningModuleStorage() const
Definition: DeclBase.cpp:119
void dumpColor() const
Definition: ASTDumper.cpp:239
const Decl * getPreviousDecl() const
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition: DeclBase.h:1055
bool isFunctionPointerType() const
Definition: DeclBase.cpp:1135
const TranslationUnitDecl * getTranslationUnitDecl() const
Definition: DeclBase.h:482
virtual ~Decl()
bool isReachable() const
Definition: DeclBase.h:853
ExternalSourceSymbolAttr * getExternalSourceSymbolAttr() const
Looks on this and related declarations for an applicable external source symbol attribute.
Definition: DeclBase.cpp:567
void setFromASTFile()
Set the FromASTFile flag.
Definition: DeclBase.h:698
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
Definition: DeclBase.h:1141
Decl(Kind DK, DeclContext *DC, SourceLocation L)
Definition: DeclBase.h:395
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
Definition: Decl.cpp:100
virtual Decl * getPreviousDeclImpl()
Implementation of getPreviousDecl(), to be overridden by any subclass that has a redeclaration chain.
Definition: DeclBase.h:985
Module * getOwningModuleForLinkage(bool IgnoreLinkage=false) const
Get the module that owns this declaration for linkage purposes.
Definition: Decl.cpp:1624
Decl(Kind DK, EmptyShell Empty)
Definition: DeclBase.h:405
llvm::iterator_range< redecl_iterator > redecl_range
Definition: DeclBase.h:1035
const Decl * getCanonicalDecl() const
Definition: DeclBase.h:969
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
Definition: DeclBase.cpp:804
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
Definition: DeclBase.h:866
bool isParameterPack() const
Whether this declaration is a parameter pack.
Definition: DeclBase.cpp:220
ASTMutationListener * getASTMutationListener() const
Definition: DeclBase.cpp:511
bool hasCachedLinkage() const
Definition: DeclBase.h:427
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
Definition: DeclBase.cpp:515
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
Definition: DeclBase.cpp:709
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition: DeclBase.cpp:132
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Definition: DeclBase.h:849
DeclContext * getParentFunctionOrMethod(bool LexicalParent=false)
Definition: DeclBase.h:961
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
void clearIdentifierNamespace()
Clears the namespace of this declaration.
Definition: DeclBase.h:1204
AttrVec::const_iterator attr_iterator
Definition: DeclBase.h:538
static unsigned getIdentifierNamespaceForKind(Kind DK)
Definition: DeclBase.cpp:823
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
Definition: DeclBase.h:780
void setTopLevelDeclInObjCContainer(bool V=true)
Definition: DeclBase.h:638
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition: DeclBase.h:1077
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition: DeclBase.cpp:545
bool isInIdentifierNamespace(unsigned NS) const
Definition: DeclBase.h:883
bool isFileContextDecl() const
Definition: DeclBase.cpp:408
static Decl * castFromDeclContext(const DeclContext *)
Definition: DeclBase.cpp:1003
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition: DeclBase.h:1209
@ FOK_None
Not a friend object.
Definition: DeclBase.h:1207
@ FOK_Declared
A friend of a previously-declared entity.
Definition: DeclBase.h:1208
Decl * getNextDeclInContext()
Definition: DeclBase.h:451
bool isInvisibleOutsideTheOwningModule() const
Definition: DeclBase.h:666
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
Definition: DeclBase.cpp:262
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
Definition: DeclBase.cpp:1074
SourceLocation getBodyRBrace() const
getBodyRBrace - Gets the right brace of the body, if a body exists.
Definition: DeclBase.cpp:1029
static bool isTagIdentifierNamespace(unsigned NS)
Definition: DeclBase.h:893
int64_t getID() const
Definition: DeclBase.cpp:1112
bool isReferenced() const
Whether any declaration of this entity was referenced.
Definition: DeclBase.cpp:555
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
Definition: DeclBase.cpp:1116
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition: DeclBase.h:974
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
Definition: DeclBase.cpp:1083
llvm::PointerIntPair< Decl *, 3, ModuleOwnershipKind > NextInContextAndBits
The next declaration within the same lexical DeclContext.
Definition: DeclBase.h:249
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition: DeclBase.h:833
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
Definition: DeclBase.cpp:274
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Definition: DeclBase.h:1060
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
Definition: DeclBase.cpp:1105
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition: DeclBase.cpp:227
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition: DeclBase.h:803
bool canBeWeakImported(bool &IsDefinition) const
Determines whether this symbol can be weak-imported, e.g., whether it would be well-formed to add the...
Definition: DeclBase.cpp:775
void dropAttrs()
Definition: DeclBase.cpp:968
static DeclContext * castToDeclContext(const Decl *)
Definition: DeclBase.cpp:1016
void setOwningModuleID(unsigned ID)
Set the owning module ID.
Definition: DeclBase.h:704
const DeclContext * getDeclContext() const
Definition: DeclBase.h:459
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
Definition: DeclBase.h:198
@ OBJC_TQ_Byref
Definition: DeclBase.h:204
@ OBJC_TQ_Oneway
Definition: DeclBase.h:205
@ OBJC_TQ_Bycopy
Definition: DeclBase.h:203
@ OBJC_TQ_None
Definition: DeclBase.h:199
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
Definition: DeclBase.h:210
@ OBJC_TQ_Inout
Definition: DeclBase.h:201
void dump() const
Definition: ASTDumper.cpp:220
const TemplateParameterList * getDescribedTemplateParams() const
If this is a declaration that describes some template or partial specialization, this returns the cor...
Definition: DeclBase.cpp:252
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
Definition: DeclBase.h:1170
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition: DeclBase.h:776
attr_iterator attr_begin() const
Definition: DeclBase.h:545
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
Definition: DeclBase.cpp:376
const Attr * getDefiningAttr() const
Return this declaration's defining attribute if it has one.
Definition: DeclBase.cpp:593
Linkage getCachedLinkage() const
Definition: DeclBase.h:419
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition: DeclBase.h:2739
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
Definition: DeclBase.cpp:1147
virtual bool hasBody() const
Returns true if this Decl represents a declaration for a body of code, such as a function or method d...
Definition: DeclBase.h:1083
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
Definition: DeclBase.cpp:1173
bool isInvalidDecl() const
Definition: DeclBase.h:594
unsigned getIdentifierNamespace() const
Definition: DeclBase.h:879
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
Definition: DeclBase.h:343
const Decl * getMostRecentDecl() const
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition: DeclBase.h:1070
virtual Decl * getNextRedeclarationImpl()
Returns the next redeclaration or itself if this is the only decl.
Definition: DeclBase.h:981
Decl & operator=(Decl &&)=delete
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
Definition: DeclBase.cpp:588
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
Definition: DeclBase.h:1159
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition: DeclBase.h:565
friend class CXXClassMemberWrapper
Definition: DeclBase.h:331
void setAccess(AccessSpecifier AS)
Definition: DeclBase.h:508
SourceLocation getLocation() const
Definition: DeclBase.h:445
redecl_iterator redecls_end() const
Definition: DeclBase.h:1047
const char * getDeclKindName() const
Definition: DeclBase.cpp:123
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
Definition: DeclBase.h:115
@ IDNS_NonMemberOperator
This declaration is a C++ operator declared in a non-class context.
Definition: DeclBase.h:168
@ IDNS_TagFriend
This declaration is a friend class.
Definition: DeclBase.h:157
@ IDNS_Ordinary
Ordinary names.
Definition: DeclBase.h:144
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
Definition: DeclBase.h:130
@ IDNS_OMPReduction
This declaration is an OpenMP user defined reduction construction.
Definition: DeclBase.h:178
@ IDNS_Label
Labels, declared with 'x:' and referenced with 'goto x'.
Definition: DeclBase.h:117
@ IDNS_Member
Members, declared with object declarations within tag definitions.
Definition: DeclBase.h:136
@ IDNS_OMPMapper
This declaration is an OpenMP user defined mapper.
Definition: DeclBase.h:181
@ IDNS_ObjCProtocol
Objective C @protocol.
Definition: DeclBase.h:147
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
Definition: DeclBase.h:140
@ IDNS_OrdinaryFriend
This declaration is a friend function.
Definition: DeclBase.h:152
@ IDNS_Using
This declaration is a using declaration.
Definition: DeclBase.h:163
@ IDNS_LocalExtern
This declaration is a function-local extern declaration of a variable or function.
Definition: DeclBase.h:175
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
Definition: DeclBase.h:125
bool isDeprecated(std::string *Message=nullptr) const
Determine whether this declaration is marked 'deprecated'.
Definition: DeclBase.h:745
AccessSpecifier getAccessUnsafe() const
Retrieve the access specifier for this declaration, even though it may not yet have been properly set...
Definition: DeclBase.h:520
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
Definition: DeclBase.cpp:210
void setLocalOwningModule(Module *M)
Definition: DeclBase.h:820
const DeclContext * getNonTransparentDeclContext() const
Definition: DeclBase.h:467
void setImplicit(bool I=true)
Definition: DeclBase.h:600
void setReferenced(bool R=true)
Definition: DeclBase.h:629
const DeclContext * getLexicalDeclContext() const
Definition: DeclBase.h:913
static void printGroup(Decl **Begin, unsigned NumDecls, raw_ostream &Out, const PrintingPolicy &Policy, unsigned Indentation=0)
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
Definition: DeclBase.h:627
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition: DeclBase.h:1039
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
Definition: DeclBase.h:614
unsigned Access
Access - Used by C++ decls for the access specifier.
Definition: DeclBase.h:339
bool isTopLevelDeclInObjCContainer() const
Whether this declaration is a top-level declaration (function, global variable, etc....
Definition: DeclBase.h:634
void setLocation(SourceLocation L)
Definition: DeclBase.h:446
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition: DeclBase.cpp:530
bool isDefinedOutsideFunctionOrMethod() const
isDefinedOutsideFunctionOrMethod - This predicate returns true if this scoped decl is defined outside...
Definition: DeclBase.h:939
DeclContext * getDeclContext()
Definition: DeclBase.h:454
attr_range attrs() const
Definition: DeclBase.h:541
AccessSpecifier getAccess() const
Definition: DeclBase.h:513
const Decl * getNextDeclInContext() const
Definition: DeclBase.h:452
bool isInAnonymousNamespace() const
Definition: DeclBase.cpp:393
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: DeclBase.h:437
redecl_iterator redecls_begin() const
Definition: DeclBase.h:1043
static void EnableStatistics()
Definition: DeclBase.cpp:174
TranslationUnitDecl * getTranslationUnitDecl()
Definition: DeclBase.cpp:486
VersionTuple getVersionIntroduced() const
Retrieve the version of the target platform in which this declaration was introduced.
Definition: DeclBase.cpp:761
specific_attr_iterator< T > specific_attr_end() const
Definition: DeclBase.h:575
virtual Decl * getMostRecentDeclImpl()
Implementation of getMostRecentDecl(), to be overridden by any subclass that has a redeclaration chai...
Definition: DeclBase.h:989
bool hasOwningModule() const
Is this declaration owned by some module?
Definition: DeclBase.h:828
Decl(const Decl &)=delete
void setCachedLinkage(Linkage L) const
Definition: DeclBase.h:423
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
Definition: DeclBase.h:686
void dropAttr()
Definition: DeclBase.h:562
static void PrintStats()
Definition: DeclBase.cpp:178
llvm::iterator_range< attr_iterator > attr_range
Definition: DeclBase.h:539
specific_attr_iterator< T > specific_attr_begin() const
Definition: DeclBase.h:570
void updateOutOfDate(IdentifierInfo &II) const
Update a potentially out-of-date declaration.
Definition: DeclBase.cpp:63
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
AttrVec & getAttrs()
Definition: DeclBase.h:530
static bool isFlexibleArrayMemberLike(ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
Definition: DeclBase.cpp:413
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Definition: DeclBase.cpp:336
bool hasTagIdentifierNamespace() const
Definition: DeclBase.h:889
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:908
bool hasAttr() const
Definition: DeclBase.h:583
friend class DeclContext
Definition: DeclBase.h:252
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
Definition: DeclBase.h:1225
void setLexicalDeclContext(DeclContext *DC)
Definition: DeclBase.cpp:340
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclBase.h:968
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
Definition: DeclBase.h:216
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Kind getKind() const
Definition: DeclBase.h:448
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition: DeclBase.h:871
Module * getLocalOwningModule() const
Get the local owning module, if known.
Definition: DeclBase.h:812
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
Definition: DeclBase.cpp:507
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition: DeclBase.h:433
static bool classofKind(Kind K)
Definition: DeclBase.h:1232
Decl & operator=(const Decl &)=delete
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
Definition: DeclBase.h:860
const Decl * getNonClosureContext() const
Definition: DeclBase.h:477
The name of a declaration.
A dependently-generated diagnostic.
Abstract interface for external sources of AST nodes.
Represents a function declaration or definition.
Definition: Decl.h:1971
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4252
One of these records is kept for each identifier that is lexed.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:461
Represents a linkage specification.
Definition: DeclCXX.h:2934
Describes a module or submodule.
Definition: Module.h:105
This represents a decl that may have a name.
Definition: Decl.h:249
PrettyStackTraceDecl - If a crash occurs, indicate that it happened when doing something to a specifi...
Definition: DeclBase.h:1287
void print(raw_ostream &OS) const override
Definition: DeclBase.cpp:309
PrettyStackTraceDecl(const Decl *theDecl, SourceLocation L, SourceManager &sm, const char *Msg)
Definition: DeclBase.h:1294
A (possibly-)qualified type.
Definition: Type.h:940
Represents a struct/union/class.
Definition: Decl.h:4169
Provides common interface for the Decls that can be redeclared.
Definition: Redeclarable.h:84
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
Definition: Stmt.h:84
An array of decls optimized for the common case of only containing one entry.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Definition: DeclTemplate.h:394
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
The top declaration context.
Definition: Decl.h:84
Represents C++ using-directive.
Definition: DeclCXX.h:3015
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Definition: AttrIterator.h:33
The JSON file list parser is used to communicate input to InstallAPI.
ASTDumpOutputFormat
Used to specify the format for printing AST dump information.
@ ADOF_Default
bool isa(CodeGen::Address addr)
Definition: Address.h:294
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition: Specifiers.h:35
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition: DeclCXX.h:2926
OMPDeclareReductionInitKind
Definition: DeclOpenMP.h:161
StorageClass
Storage classes.
Definition: Specifiers.h:245
ObjCMethodFamily
A family of Objective-C methods.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition: Linkage.h:24
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Language
The language for the input, used to select and validate the language standard and possible actions.
Definition: LangStandard.h:23
@ ObjCMethodFamilyBitWidth
TagTypeKind
The kind of a tag type.
Definition: Type.h:6295
AvailabilityResult
Captures the result of checking the availability of a declaration.
Definition: DeclBase.h:72
@ AR_NotYetIntroduced
Definition: DeclBase.h:74
@ AR_Available
Definition: DeclBase.h:73
@ AR_Deprecated
Definition: DeclBase.h:75
@ AR_Unavailable
Definition: DeclBase.h:76
ObjCImplementationControl
Definition: DeclObjC.h:118
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
Definition: Decl.h:4146
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
Definition: DeclBase.h:1408
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition: DeclBase.h:1275
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:120
@ AS_none
Definition: Specifiers.h:124
unsigned long uint64_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
Definition: Format.h:5394
#define true
Definition: stdbool.h:21
#define false
Definition: stdbool.h:22
UsingDirectiveDecl * operator*() const
Definition: DeclBase.cpp:2066
udir_iterator(lookup_iterator I)
Definition: DeclBase.h:2598
A placeholder type used to construct an empty shell of a decl-derived type that will be filled in lat...
Definition: DeclBase.h:102
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
static ToTy * doit(DeclContext *Val)
Definition: DeclBase.h:2764
static const ToTy * doit(const DeclContext *Val)
Definition: DeclBase.h:2760
static const ToTy * doit(const DeclContext *Val)
Definition: DeclBase.h:2748
static ToTy * doit(DeclContext *Val)
Definition: DeclBase.h:2752
static void * getAsVoidPointer(::clang::NamedDecl *P)
Definition: DeclBase.h:1306
static inline ::clang::NamedDecl * getFromVoidPointer(void *P)
Definition: DeclBase.h:1307
::clang::DeclContext & doit(const FromTy &Val)
Definition: DeclBase.h:2815
::clang::DeclContext * doit(const FromTy *Val)
Definition: DeclBase.h:2822
static const ::clang::DeclContext & doit(const FromTy &Val)
Definition: DeclBase.h:2829
static const ::clang::DeclContext * doit(const FromTy *Val)
Definition: DeclBase.h:2836
static bool doit(const ::clang::DeclContext &Val)
Definition: DeclBase.h:2776