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