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