clang 20.0.0git
DeclBase.cpp
Go to the documentation of this file.
1//===- DeclBase.cpp - Declaration AST Node Implementation -----------------===//
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 implements the Decl and DeclContext classes.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/AST/DeclBase.h"
15#include "clang/AST/ASTLambda.h"
17#include "clang/AST/Attr.h"
19#include "clang/AST/Decl.h"
20#include "clang/AST/DeclCXX.h"
23#include "clang/AST/DeclObjC.h"
28#include "clang/AST/Stmt.h"
29#include "clang/AST/Type.h"
31#include "clang/Basic/LLVM.h"
32#include "clang/Basic/Module.h"
37#include "llvm/ADT/PointerIntPair.h"
38#include "llvm/ADT/StringRef.h"
39#include "llvm/Support/ErrorHandling.h"
40#include "llvm/Support/MathExtras.h"
41#include "llvm/Support/VersionTuple.h"
42#include "llvm/Support/raw_ostream.h"
43#include <algorithm>
44#include <cassert>
45#include <cstddef>
46#include <string>
47#include <tuple>
48#include <utility>
49
50using namespace clang;
51
52//===----------------------------------------------------------------------===//
53// Statistics
54//===----------------------------------------------------------------------===//
55
56#define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
57#define ABSTRACT_DECL(DECL)
58#include "clang/AST/DeclNodes.inc"
59
62}
63
64#define DECL(DERIVED, BASE) \
65 static_assert(alignof(Decl) >= alignof(DERIVED##Decl), \
66 "Alignment sufficient after objects prepended to " #DERIVED);
67#define ABSTRACT_DECL(DECL)
68#include "clang/AST/DeclNodes.inc"
69
70void *Decl::operator new(std::size_t Size, const ASTContext &Context,
71 GlobalDeclID ID, std::size_t Extra) {
72 // Allocate an extra 8 bytes worth of storage, which ensures that the
73 // resulting pointer will still be 8-byte aligned.
74 static_assert(sizeof(uint64_t) >= alignof(Decl), "Decl won't be misaligned");
75 void *Start = Context.Allocate(Size + Extra + 8);
76 void *Result = (char*)Start + 8;
77
78 uint64_t *PrefixPtr = (uint64_t *)Result - 1;
79
80 *PrefixPtr = ID.getRawValue();
81
82 // We leave the upper 16 bits to store the module IDs. 48 bits should be
83 // sufficient to store a declaration ID.
84 assert(*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48));
85
86 return Result;
87}
88
89void *Decl::operator new(std::size_t Size, const ASTContext &Ctx,
90 DeclContext *Parent, std::size_t Extra) {
91 assert(!Parent || &Parent->getParentASTContext() == &Ctx);
92 // With local visibility enabled, we track the owning module even for local
93 // declarations. We create the TU decl early and may not yet know what the
94 // LangOpts are, so conservatively allocate the storage.
96 // Ensure required alignment of the resulting object by adding extra
97 // padding at the start if required.
98 size_t ExtraAlign =
99 llvm::offsetToAlignment(sizeof(Module *), llvm::Align(alignof(Decl)));
100 auto *Buffer = reinterpret_cast<char *>(
101 ::operator new(ExtraAlign + sizeof(Module *) + Size + Extra, Ctx));
102 Buffer += ExtraAlign;
103 auto *ParentModule =
104 Parent ? cast<Decl>(Parent)->getOwningModule() : nullptr;
105 return new (Buffer) Module*(ParentModule) + 1;
106 }
107 return ::operator new(Size + Extra, Ctx);
108}
109
111 if (!isFromASTFile())
112 return GlobalDeclID();
113 // See the comments in `Decl::operator new` for details.
114 uint64_t ID = *((const uint64_t *)this - 1);
115 return GlobalDeclID(ID & llvm::maskTrailingOnes<uint64_t>(48));
116}
117
118unsigned Decl::getOwningModuleID() const {
119 if (!isFromASTFile())
120 return 0;
121
122 uint64_t ID = *((const uint64_t *)this - 1);
123 return ID >> 48;
124}
125
126void Decl::setOwningModuleID(unsigned ID) {
127 assert(isFromASTFile() && "Only works on a deserialized declaration");
128 uint64_t *IDAddress = (uint64_t *)this - 1;
129 *IDAddress &= llvm::maskTrailingOnes<uint64_t>(48);
130 *IDAddress |= (uint64_t)ID << 48;
131}
132
134 if (getOwningModule() &&
135 getOwningModule()->getTopLevelModule()->isNamedModule())
137
138 return nullptr;
139}
140
141Module *Decl::getOwningModuleSlow() const {
142 assert(isFromASTFile() && "Not from AST file?");
144}
145
148}
149
150const char *Decl::getDeclKindName() const {
151 switch (DeclKind) {
152 default: llvm_unreachable("Declaration not in DeclNodes.inc!");
153#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
154#define ABSTRACT_DECL(DECL)
155#include "clang/AST/DeclNodes.inc"
156 }
157}
158
160 InvalidDecl = Invalid;
161 assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition());
162 if (!Invalid) {
163 return;
164 }
165
166 if (!isa<ParmVarDecl>(this)) {
167 // Defensive maneuver for ill-formed code: we're likely not to make it to
168 // a point where we set the access specifier, so default it to "public"
169 // to avoid triggering asserts elsewhere in the front end.
171 }
172
173 // Marking a DecompositionDecl as invalid implies all the child BindingDecl's
174 // are invalid too.
175 if (auto *DD = dyn_cast<DecompositionDecl>(this)) {
176 for (auto *Binding : DD->bindings()) {
177 Binding->setInvalidDecl();
178 }
179 }
180}
181
183 switch (getDeclKind()) {
184#define DECL(DERIVED, BASE) case Decl::DERIVED: return true;
185#define ABSTRACT_DECL(DECL)
186#include "clang/AST/DeclNodes.inc"
187 }
188 return false;
189}
190
191const char *DeclContext::getDeclKindName() const {
192 switch (getDeclKind()) {
193#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
194#define ABSTRACT_DECL(DECL)
195#include "clang/AST/DeclNodes.inc"
196 }
197 llvm_unreachable("Declaration context not in DeclNodes.inc!");
198}
199
200bool Decl::StatisticsEnabled = false;
202 StatisticsEnabled = true;
203}
204
206 llvm::errs() << "\n*** Decl Stats:\n";
207
208 int totalDecls = 0;
209#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
210#define ABSTRACT_DECL(DECL)
211#include "clang/AST/DeclNodes.inc"
212 llvm::errs() << " " << totalDecls << " decls total.\n";
213
214 int totalBytes = 0;
215#define DECL(DERIVED, BASE) \
216 if (n##DERIVED##s > 0) { \
217 totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
218 llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
219 << sizeof(DERIVED##Decl) << " each (" \
220 << n##DERIVED##s * sizeof(DERIVED##Decl) \
221 << " bytes)\n"; \
222 }
223#define ABSTRACT_DECL(DECL)
224#include "clang/AST/DeclNodes.inc"
225
226 llvm::errs() << "Total bytes = " << totalBytes << "\n";
227}
228
230 switch (k) {
231#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
232#define ABSTRACT_DECL(DECL)
233#include "clang/AST/DeclNodes.inc"
234 }
235}
236
238 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(this))
239 return TTP->isParameterPack();
240 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(this))
241 return NTTP->isParameterPack();
242 if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(this))
243 return TTP->isParameterPack();
244 return false;
245}
246
248 if (const auto *Var = dyn_cast<VarDecl>(this))
249 return Var->isParameterPack();
250
252}
253
255 if (auto *FD = dyn_cast<FunctionDecl>(this))
256 return FD;
257 if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
258 return FTD->getTemplatedDecl();
259 return nullptr;
260}
261
263 return isa<TemplateDecl>(this);
264}
265
267 if (auto *FD = dyn_cast<FunctionDecl>(this))
268 return FD->getDescribedFunctionTemplate();
269 if (auto *RD = dyn_cast<CXXRecordDecl>(this))
270 return RD->getDescribedClassTemplate();
271 if (auto *VD = dyn_cast<VarDecl>(this))
272 return VD->getDescribedVarTemplate();
273 if (auto *AD = dyn_cast<TypeAliasDecl>(this))
274 return AD->getDescribedAliasTemplate();
275
276 return nullptr;
277}
278
280 if (auto *TD = getDescribedTemplate())
281 return TD->getTemplateParameters();
282 if (auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(this))
283 return CTPSD->getTemplateParameters();
284 if (auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(this))
285 return VTPSD->getTemplateParameters();
286 return nullptr;
287}
288
289bool Decl::isTemplated() const {
290 // A declaration is templated if it is a template or a template pattern, or
291 // is within (lexcially for a friend or local function declaration,
292 // semantically otherwise) a dependent context.
293 if (auto *AsDC = dyn_cast<DeclContext>(this))
294 return AsDC->isDependentContext();
295 auto *DC = getFriendObjectKind() || isLocalExternDecl()
297 return DC->isDependentContext() || isTemplateDecl() ||
299}
300
301unsigned Decl::getTemplateDepth() const {
302 if (auto *DC = dyn_cast<DeclContext>(this))
303 if (DC->isFileContext())
304 return 0;
305
306 if (auto *TPL = getDescribedTemplateParams())
307 return TPL->getDepth() + 1;
308
309 // If this is a dependent lambda, there might be an enclosing variable
310 // template. In this case, the next step is not the parent DeclContext (or
311 // even a DeclContext at all).
312 auto *RD = dyn_cast<CXXRecordDecl>(this);
313 if (RD && RD->isDependentLambda())
314 if (Decl *Context = RD->getLambdaContextDecl())
315 return Context->getTemplateDepth();
316
317 const DeclContext *DC =
319 return cast<Decl>(DC)->getTemplateDepth();
320}
321
322const DeclContext *Decl::getParentFunctionOrMethod(bool LexicalParent) const {
323 for (const DeclContext *DC = LexicalParent ? getLexicalDeclContext()
324 : getDeclContext();
325 DC && !DC->isFileContext(); DC = DC->getParent())
326 if (DC->isFunctionOrMethod())
327 return DC;
328
329 return nullptr;
330}
331
332//===----------------------------------------------------------------------===//
333// PrettyStackTraceDecl Implementation
334//===----------------------------------------------------------------------===//
335
336void PrettyStackTraceDecl::print(raw_ostream &OS) const {
337 SourceLocation TheLoc = Loc;
338 if (TheLoc.isInvalid() && TheDecl)
339 TheLoc = TheDecl->getLocation();
340
341 if (TheLoc.isValid()) {
342 TheLoc.print(OS, SM);
343 OS << ": ";
344 }
345
346 OS << Message;
347
348 if (const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
349 OS << " '";
350 DN->printQualifiedName(OS);
351 OS << '\'';
352 }
353 OS << '\n';
354}
355
356//===----------------------------------------------------------------------===//
357// Decl Implementation
358//===----------------------------------------------------------------------===//
359
360// Out-of-line virtual method providing a home for Decl.
361Decl::~Decl() = default;
362
364 DeclCtx = DC;
365}
366
368 if (DC == getLexicalDeclContext())
369 return;
370
371 if (isInSemaDC()) {
372 setDeclContextsImpl(getDeclContext(), DC, getASTContext());
373 } else {
374 getMultipleDC()->LexicalDC = DC;
375 }
376
377 // FIXME: We shouldn't be changing the lexical context of declarations
378 // imported from AST files.
379 if (!isFromASTFile()) {
380 setModuleOwnershipKind(getModuleOwnershipKindForChildOf(DC));
381 if (hasOwningModule())
382 setLocalOwningModule(cast<Decl>(DC)->getOwningModule());
383 }
384
385 assert(
387 getOwningModule()) &&
388 "hidden declaration has no owning module");
389}
390
391void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
392 ASTContext &Ctx) {
393 if (SemaDC == LexicalDC) {
394 DeclCtx = SemaDC;
395 } else {
396 auto *MDC = new (Ctx) Decl::MultipleDC();
397 MDC->SemanticDC = SemaDC;
398 MDC->LexicalDC = LexicalDC;
399 DeclCtx = MDC;
400 }
401}
402
404 const DeclContext *LDC = getLexicalDeclContext();
405 if (!LDC->isDependentContext())
406 return false;
407 while (true) {
408 if (LDC->isFunctionOrMethod())
409 return true;
410 if (!isa<TagDecl>(LDC))
411 return false;
412 if (const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
413 if (CRD->isLambda())
414 return true;
415 LDC = LDC->getLexicalParent();
416 }
417 return false;
418}
419
421 for (const DeclContext *DC = getDeclContext(); DC; DC = DC->getParent()) {
422 if (const auto *ND = dyn_cast<NamespaceDecl>(DC))
423 if (ND->isAnonymousNamespace())
424 return true;
425 }
426
427 return false;
428}
429
431 const DeclContext *DC = getDeclContext();
432 return DC && DC->getNonTransparentContext()->isStdNamespace();
433}
434
436 const auto *DC = dyn_cast<DeclContext>(this);
437 return DC && DC->isFileContext();
438}
439
441 ASTContext &Ctx, const Decl *D, QualType Ty,
442 LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel,
443 bool IgnoreTemplateOrMacroSubstitution) {
444 // For compatibility with existing code, we treat arrays of length 0 or
445 // 1 as flexible array members.
446 const auto *CAT = Ctx.getAsConstantArrayType(Ty);
447 if (CAT) {
449
450 llvm::APInt Size = CAT->getSize();
451 if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
452 return false;
453
454 // GCC extension, only allowed to represent a FAM.
455 if (Size.isZero())
456 return true;
457
458 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete && Size.uge(1))
459 return false;
460
461 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete && Size.uge(2))
462 return false;
463 } else if (!Ctx.getAsIncompleteArrayType(Ty)) {
464 return false;
465 }
466
467 if (const auto *OID = dyn_cast_if_present<ObjCIvarDecl>(D))
468 return OID->getNextIvar() == nullptr;
469
470 const auto *FD = dyn_cast_if_present<FieldDecl>(D);
471 if (!FD)
472 return false;
473
474 if (CAT) {
475 // GCC treats an array memeber of a union as an FAM if the size is one or
476 // zero.
477 llvm::APInt Size = CAT->getSize();
478 if (FD->getParent()->isUnion() && (Size.isZero() || Size.isOne()))
479 return true;
480 }
481
482 // Don't consider sizes resulting from macro expansions or template argument
483 // substitution to form C89 tail-padded arrays.
484 if (IgnoreTemplateOrMacroSubstitution) {
485 TypeSourceInfo *TInfo = FD->getTypeSourceInfo();
486 while (TInfo) {
487 TypeLoc TL = TInfo->getTypeLoc();
488
489 // Look through typedefs.
491 const TypedefNameDecl *TDL = TTL.getTypedefNameDecl();
492 TInfo = TDL->getTypeSourceInfo();
493 continue;
494 }
495
496 if (auto CTL = TL.getAs<ConstantArrayTypeLoc>()) {
497 if (const Expr *SizeExpr =
498 dyn_cast_if_present<IntegerLiteral>(CTL.getSizeExpr());
499 !SizeExpr || SizeExpr->getExprLoc().isMacroID())
500 return false;
501 }
502
503 break;
504 }
505 }
506
507 // Test that the field is the last in the structure.
509 DeclContext::decl_iterator(const_cast<FieldDecl *>(FD)));
510 return ++FI == FD->getParent()->field_end();
511}
512
514 if (auto *TUD = dyn_cast<TranslationUnitDecl>(this))
515 return TUD;
516
518 assert(DC && "This decl is not contained in a translation unit!");
519
520 while (!DC->isTranslationUnit()) {
521 DC = DC->getParent();
522 assert(DC && "This decl is not contained in a translation unit!");
523 }
524
525 return cast<TranslationUnitDecl>(DC);
526}
527
530}
531
532/// Helper to get the language options from the ASTContext.
533/// Defined out of line to avoid depending on ASTContext.h.
535 return getASTContext().getLangOpts();
536}
537
540}
541
542unsigned Decl::getMaxAlignment() const {
543 if (!hasAttrs())
544 return 0;
545
546 unsigned Align = 0;
547 const AttrVec &V = getAttrs();
548 ASTContext &Ctx = getASTContext();
549 specific_attr_iterator<AlignedAttr> I(V.begin()), E(V.end());
550 for (; I != E; ++I) {
551 if (!I->isAlignmentErrorDependent())
552 Align = std::max(Align, I->getAlignment(Ctx));
553 }
554 return Align;
555}
556
557bool Decl::isUsed(bool CheckUsedAttr) const {
558 const Decl *CanonD = getCanonicalDecl();
559 if (CanonD->Used)
560 return true;
561
562 // Check for used attribute.
563 // Ask the most recent decl, since attributes accumulate in the redecl chain.
564 if (CheckUsedAttr && getMostRecentDecl()->hasAttr<UsedAttr>())
565 return true;
566
567 // The information may have not been deserialized yet. Force deserialization
568 // to complete the needed information.
569 return getMostRecentDecl()->getCanonicalDecl()->Used;
570}
571
573 if (isUsed(false))
574 return;
575
576 if (C.getASTMutationListener())
577 C.getASTMutationListener()->DeclarationMarkedUsed(this);
578
579 setIsUsed();
580}
581
582bool Decl::isReferenced() const {
583 if (Referenced)
584 return true;
585
586 // Check redeclarations.
587 for (const auto *I : redecls())
588 if (I->Referenced)
589 return true;
590
591 return false;
592}
593
594ExternalSourceSymbolAttr *Decl::getExternalSourceSymbolAttr() const {
595 const Decl *Definition = nullptr;
596 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(this)) {
597 Definition = ID->getDefinition();
598 } else if (auto *PD = dyn_cast<ObjCProtocolDecl>(this)) {
599 Definition = PD->getDefinition();
600 } else if (auto *TD = dyn_cast<TagDecl>(this)) {
601 Definition = TD->getDefinition();
602 }
603 if (!Definition)
604 Definition = this;
605
606 if (auto *attr = Definition->getAttr<ExternalSourceSymbolAttr>())
607 return attr;
608 if (auto *dcd = dyn_cast<Decl>(getDeclContext())) {
609 return dcd->getAttr<ExternalSourceSymbolAttr>();
610 }
611
612 return nullptr;
613}
614
616 return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>() ||
617 hasAttr<LoaderUninitializedAttr>();
618}
619
621 if (auto *AA = getAttr<AliasAttr>())
622 return AA;
623 if (auto *IFA = getAttr<IFuncAttr>())
624 return IFA;
625 if (auto *NZA = getAttr<LoaderUninitializedAttr>())
626 return NZA;
627 return nullptr;
628}
629
630static StringRef getRealizedPlatform(const AvailabilityAttr *A,
631 const ASTContext &Context) {
632 // Check if this is an App Extension "platform", and if so chop off
633 // the suffix for matching with the actual platform.
634 StringRef RealizedPlatform = A->getPlatform()->getName();
635 if (!Context.getLangOpts().AppExt)
636 return RealizedPlatform;
637 size_t suffix = RealizedPlatform.rfind("_app_extension");
638 if (suffix != StringRef::npos)
639 return RealizedPlatform.slice(0, suffix);
640 return RealizedPlatform;
641}
642
643/// Determine the availability of the given declaration based on
644/// the target platform.
645///
646/// When it returns an availability result other than \c AR_Available,
647/// if the \p Message parameter is non-NULL, it will be set to a
648/// string describing why the entity is unavailable.
649///
650/// FIXME: Make these strings localizable, since they end up in
651/// diagnostics.
653 const AvailabilityAttr *A,
654 std::string *Message,
655 VersionTuple EnclosingVersion) {
656 if (EnclosingVersion.empty())
657 EnclosingVersion = Context.getTargetInfo().getPlatformMinVersion();
658
659 if (EnclosingVersion.empty())
660 return AR_Available;
661
662 StringRef ActualPlatform = A->getPlatform()->getName();
663 StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
664
665 // Match the platform name.
666 if (getRealizedPlatform(A, Context) != TargetPlatform)
667 return AR_Available;
668
669 StringRef PrettyPlatformName
670 = AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
671
672 if (PrettyPlatformName.empty())
673 PrettyPlatformName = ActualPlatform;
674
675 std::string HintMessage;
676 if (!A->getMessage().empty()) {
677 HintMessage = " - ";
678 HintMessage += A->getMessage();
679 }
680
681 // Make sure that this declaration has not been marked 'unavailable'.
682 if (A->getUnavailable()) {
683 if (Message) {
684 Message->clear();
685 llvm::raw_string_ostream Out(*Message);
686 Out << "not available on " << PrettyPlatformName
687 << HintMessage;
688 }
689
690 return AR_Unavailable;
691 }
692
693 // Make sure that this declaration has already been introduced.
694 if (!A->getIntroduced().empty() &&
695 EnclosingVersion < A->getIntroduced()) {
696 IdentifierInfo *IIEnv = A->getEnvironment();
697 StringRef TargetEnv =
698 Context.getTargetInfo().getTriple().getEnvironmentName();
699 StringRef EnvName = llvm::Triple::getEnvironmentTypeName(
700 Context.getTargetInfo().getTriple().getEnvironment());
701 // Matching environment or no environment on attribute
702 if (!IIEnv || (!TargetEnv.empty() && IIEnv->getName() == TargetEnv)) {
703 if (Message) {
704 Message->clear();
705 llvm::raw_string_ostream Out(*Message);
706 VersionTuple VTI(A->getIntroduced());
707 Out << "introduced in " << PrettyPlatformName << " " << VTI << " "
708 << EnvName << HintMessage;
709 }
710 }
711 // Non-matching environment or no environment on target
712 else {
713 if (Message) {
714 Message->clear();
715 llvm::raw_string_ostream Out(*Message);
716 Out << "not available on " << PrettyPlatformName << " " << EnvName
717 << HintMessage;
718 }
719 }
720
721 return A->getStrict() ? AR_Unavailable : AR_NotYetIntroduced;
722 }
723
724 // Make sure that this declaration hasn't been obsoleted.
725 if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
726 if (Message) {
727 Message->clear();
728 llvm::raw_string_ostream Out(*Message);
729 VersionTuple VTO(A->getObsoleted());
730 Out << "obsoleted in " << PrettyPlatformName << ' '
731 << VTO << HintMessage;
732 }
733
734 return AR_Unavailable;
735 }
736
737 // Make sure that this declaration hasn't been deprecated.
738 if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
739 if (Message) {
740 Message->clear();
741 llvm::raw_string_ostream Out(*Message);
742 VersionTuple VTD(A->getDeprecated());
743 Out << "first deprecated in " << PrettyPlatformName << ' '
744 << VTD << HintMessage;
745 }
746
747 return AR_Deprecated;
748 }
749
750 return AR_Available;
751}
752
754 VersionTuple EnclosingVersion,
755 StringRef *RealizedPlatform) const {
756 if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
757 return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
758 RealizedPlatform);
759
761 std::string ResultMessage;
762
763 for (const auto *A : attrs()) {
764 if (const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
765 if (Result >= AR_Deprecated)
766 continue;
767
768 if (Message)
769 ResultMessage = std::string(Deprecated->getMessage());
770
772 continue;
773 }
774
775 if (const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
776 if (Message)
777 *Message = std::string(Unavailable->getMessage());
778 return AR_Unavailable;
779 }
780
781 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
783 Message, EnclosingVersion);
784
785 if (AR == AR_Unavailable) {
786 if (RealizedPlatform)
787 *RealizedPlatform = Availability->getPlatform()->getName();
788 return AR_Unavailable;
789 }
790
791 if (AR > Result) {
792 Result = AR;
793 if (Message)
794 ResultMessage.swap(*Message);
795 }
796 continue;
797 }
798 }
799
800 if (Message)
801 Message->swap(ResultMessage);
802 return Result;
803}
804
805VersionTuple Decl::getVersionIntroduced() const {
806 const ASTContext &Context = getASTContext();
807 StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
808 for (const auto *A : attrs()) {
809 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
810 if (getRealizedPlatform(Availability, Context) != TargetPlatform)
811 continue;
812 if (!Availability->getIntroduced().empty())
813 return Availability->getIntroduced();
814 }
815 }
816 return {};
817}
818
819bool Decl::canBeWeakImported(bool &IsDefinition) const {
820 IsDefinition = false;
821
822 // Variables, if they aren't definitions.
823 if (const auto *Var = dyn_cast<VarDecl>(this)) {
824 if (Var->isThisDeclarationADefinition()) {
825 IsDefinition = true;
826 return false;
827 }
828 return true;
829 }
830 // Functions, if they aren't definitions.
831 if (const auto *FD = dyn_cast<FunctionDecl>(this)) {
832 if (FD->hasBody()) {
833 IsDefinition = true;
834 return false;
835 }
836 return true;
837
838 }
839 // Objective-C classes, if this is the non-fragile runtime.
840 if (isa<ObjCInterfaceDecl>(this) &&
842 return true;
843 }
844 // Nothing else.
845 return false;
846}
847
849 bool IsDefinition;
850 if (!canBeWeakImported(IsDefinition))
851 return false;
852
853 for (const auto *A : getMostRecentDecl()->attrs()) {
854 if (isa<WeakImportAttr>(A))
855 return true;
856
857 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
858 if (CheckAvailability(getASTContext(), Availability, nullptr,
859 VersionTuple()) == AR_NotYetIntroduced)
860 return true;
861 }
862 }
863
864 return false;
865}
866
868 switch (DeclKind) {
869 case Function:
870 case CXXDeductionGuide:
871 case CXXMethod:
872 case CXXConstructor:
873 case ConstructorUsingShadow:
874 case CXXDestructor:
875 case CXXConversion:
876 case EnumConstant:
877 case Var:
878 case ImplicitParam:
879 case ParmVar:
880 case ObjCMethod:
881 case ObjCProperty:
882 case MSProperty:
883 case HLSLBuffer:
884 return IDNS_Ordinary;
885 case Label:
886 return IDNS_Label;
887
888 case Binding:
889 case NonTypeTemplateParm:
890 case VarTemplate:
891 case Concept:
892 // These (C++-only) declarations are found by redeclaration lookup for
893 // tag types, so we include them in the tag namespace.
894 return IDNS_Ordinary | IDNS_Tag;
895
896 case ObjCCompatibleAlias:
897 case ObjCInterface:
898 return IDNS_Ordinary | IDNS_Type;
899
900 case Typedef:
901 case TypeAlias:
902 case TemplateTypeParm:
903 case ObjCTypeParam:
904 return IDNS_Ordinary | IDNS_Type;
905
906 case UnresolvedUsingTypename:
908
909 case UsingShadow:
910 return 0; // we'll actually overwrite this later
911
912 case UnresolvedUsingValue:
913 return IDNS_Ordinary | IDNS_Using;
914
915 case Using:
916 case UsingPack:
917 case UsingEnum:
918 return IDNS_Using;
919
920 case ObjCProtocol:
921 return IDNS_ObjCProtocol;
922
923 case Field:
924 case IndirectField:
925 case ObjCAtDefsField:
926 case ObjCIvar:
927 return IDNS_Member;
928
929 case Record:
930 case CXXRecord:
931 case Enum:
932 return IDNS_Tag | IDNS_Type;
933
934 case Namespace:
935 case NamespaceAlias:
936 return IDNS_Namespace;
937
938 case FunctionTemplate:
939 return IDNS_Ordinary;
940
941 case ClassTemplate:
942 case TemplateTemplateParm:
943 case TypeAliasTemplate:
945
946 case UnresolvedUsingIfExists:
947 return IDNS_Type | IDNS_Ordinary;
948
949 case OMPDeclareReduction:
950 return IDNS_OMPReduction;
951
952 case OMPDeclareMapper:
953 return IDNS_OMPMapper;
954
955 // Never have names.
956 case Friend:
957 case FriendTemplate:
958 case AccessSpec:
959 case LinkageSpec:
960 case Export:
961 case FileScopeAsm:
962 case TopLevelStmt:
963 case StaticAssert:
964 case ObjCPropertyImpl:
965 case PragmaComment:
966 case PragmaDetectMismatch:
967 case Block:
968 case Captured:
969 case TranslationUnit:
970 case ExternCContext:
971 case Decomposition:
972 case MSGuid:
973 case UnnamedGlobalConstant:
974 case TemplateParamObject:
975
976 case UsingDirective:
977 case BuiltinTemplate:
978 case ClassTemplateSpecialization:
979 case ClassTemplatePartialSpecialization:
980 case VarTemplateSpecialization:
981 case VarTemplatePartialSpecialization:
982 case ObjCImplementation:
983 case ObjCCategory:
984 case ObjCCategoryImpl:
985 case Import:
986 case OMPThreadPrivate:
987 case OMPAllocate:
988 case OMPRequires:
989 case OMPCapturedExpr:
990 case Empty:
991 case LifetimeExtendedTemporary:
992 case RequiresExprBody:
993 case ImplicitConceptSpecialization:
994 // Never looked up by name.
995 return 0;
996 }
997
998 llvm_unreachable("Invalid DeclKind!");
999}
1000
1001void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
1002 assert(!HasAttrs && "Decl already contains attrs.");
1003
1004 AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
1005 assert(AttrBlank.empty() && "HasAttrs was wrong?");
1006
1007 AttrBlank = attrs;
1008 HasAttrs = true;
1009}
1010
1012 if (!HasAttrs) return;
1013
1014 HasAttrs = false;
1016}
1017
1019 if (!hasAttrs()) {
1020 setAttrs(AttrVec(1, A));
1021 return;
1022 }
1023
1024 AttrVec &Attrs = getAttrs();
1025 if (!A->isInherited()) {
1026 Attrs.push_back(A);
1027 return;
1028 }
1029
1030 // Attribute inheritance is processed after attribute parsing. To keep the
1031 // order as in the source code, add inherited attributes before non-inherited
1032 // ones.
1033 auto I = Attrs.begin(), E = Attrs.end();
1034 for (; I != E; ++I) {
1035 if (!(*I)->isInherited())
1036 break;
1037 }
1038 Attrs.insert(I, A);
1039}
1040
1041const AttrVec &Decl::getAttrs() const {
1042 assert(HasAttrs && "No attrs to get!");
1043 return getASTContext().getDeclAttrs(this);
1044}
1045
1047 Decl::Kind DK = D->getDeclKind();
1048 switch (DK) {
1049#define DECL(NAME, BASE)
1050#define DECL_CONTEXT(NAME) \
1051 case Decl::NAME: \
1052 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
1053#include "clang/AST/DeclNodes.inc"
1054 default:
1055 llvm_unreachable("a decl that inherits DeclContext isn't handled");
1056 }
1057}
1058
1060 Decl::Kind DK = D->getKind();
1061 switch(DK) {
1062#define DECL(NAME, BASE)
1063#define DECL_CONTEXT(NAME) \
1064 case Decl::NAME: \
1065 return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
1066#include "clang/AST/DeclNodes.inc"
1067 default:
1068 llvm_unreachable("a decl that inherits DeclContext isn't handled");
1069 }
1070}
1071
1073 // Special handling of FunctionDecl to avoid de-serializing the body from PCH.
1074 // FunctionDecl stores EndRangeLoc for this purpose.
1075 if (const auto *FD = dyn_cast<FunctionDecl>(this)) {
1076 const FunctionDecl *Definition;
1077 if (FD->hasBody(Definition))
1078 return Definition->getSourceRange().getEnd();
1079 return {};
1080 }
1081
1082 if (Stmt *Body = getBody())
1083 return Body->getSourceRange().getEnd();
1084
1085 return {};
1086}
1087
1088bool Decl::AccessDeclContextCheck() const {
1089#ifndef NDEBUG
1090 // Suppress this check if any of the following hold:
1091 // 1. this is the translation unit (and thus has no parent)
1092 // 2. this is a template parameter (and thus doesn't belong to its context)
1093 // 3. this is a non-type template parameter
1094 // 4. the context is not a record
1095 // 5. it's invalid
1096 // 6. it's a C++0x static_assert.
1097 // 7. it's a block literal declaration
1098 // 8. it's a temporary with lifetime extended due to being default value.
1099 if (isa<TranslationUnitDecl>(this) || isa<TemplateTypeParmDecl>(this) ||
1100 isa<NonTypeTemplateParmDecl>(this) || !getDeclContext() ||
1101 !isa<CXXRecordDecl>(getDeclContext()) || isInvalidDecl() ||
1102 isa<StaticAssertDecl>(this) || isa<BlockDecl>(this) ||
1103 // FIXME: a ParmVarDecl can have ClassTemplateSpecialization
1104 // as DeclContext (?).
1105 isa<ParmVarDecl>(this) ||
1106 // FIXME: a ClassTemplateSpecialization or CXXRecordDecl can have
1107 // AS_none as access specifier.
1108 isa<CXXRecordDecl>(this) || isa<LifetimeExtendedTemporaryDecl>(this))
1109 return true;
1110
1111 assert(Access != AS_none &&
1112 "Access specifier is AS_none inside a record decl");
1113#endif
1114 return true;
1115}
1116
1118 const DeclContext *DC = getLexicalDeclContext();
1119
1120 while (DC && !isa<ExportDecl>(DC))
1121 DC = DC->getLexicalParent();
1122
1123 return isa_and_nonnull<ExportDecl>(DC);
1124}
1125
1127 auto *M = getOwningModule();
1128
1129 if (!M)
1130 return false;
1131
1132 // FIXME or NOTE: maybe we need to be clear about the semantics
1133 // of clang header modules. e.g., if this lives in a clang header
1134 // module included by the current unit, should we return false
1135 // here?
1136 //
1137 // This is clear for header units as the specification says the
1138 // header units live in a synthesised translation unit. So we
1139 // can return false here.
1140 M = M->getTopLevelModule();
1141 if (!M->isNamedModule())
1142 return false;
1143
1144 return M != getASTContext().getCurrentNamedModule();
1145}
1146
1148 auto *M = getOwningModule();
1149
1150 if (!M || !M->isNamedModule())
1151 return false;
1152
1153 return M == getASTContext().getCurrentNamedModule();
1154}
1155
1158 if (!Source)
1159 return false;
1160
1162}
1163
1166}
1167
1170}
1171
1174}
1175
1178}
1179
1180static Decl::Kind getKind(const Decl *D) { return D->getKind(); }
1181static Decl::Kind getKind(const DeclContext *DC) { return DC->getDeclKind(); }
1182
1183int64_t Decl::getID() const {
1184 return getASTContext().getAllocator().identifyKnownAlignedObject<Decl>(this);
1185}
1186
1187const FunctionType *Decl::getFunctionType(bool BlocksToo) const {
1188 QualType Ty;
1189 if (const auto *D = dyn_cast<ValueDecl>(this))
1190 Ty = D->getType();
1191 else if (const auto *D = dyn_cast<TypedefNameDecl>(this))
1192 Ty = D->getUnderlyingType();
1193 else
1194 return nullptr;
1195
1196 if (Ty.isNull()) {
1197 // BindingDecls do not have types during parsing, so return nullptr. This is
1198 // the only known case where `Ty` is null.
1199 assert(isa<BindingDecl>(this));
1200 return nullptr;
1201 }
1202
1203 if (Ty->isFunctionPointerType())
1204 Ty = Ty->castAs<PointerType>()->getPointeeType();
1205 else if (Ty->isFunctionReferenceType())
1206 Ty = Ty->castAs<ReferenceType>()->getPointeeType();
1207 else if (BlocksToo && Ty->isBlockPointerType())
1208 Ty = Ty->castAs<BlockPointerType>()->getPointeeType();
1209
1210 return Ty->getAs<FunctionType>();
1211}
1212
1214 QualType Ty;
1215 if (const auto *D = dyn_cast<ValueDecl>(this))
1216 Ty = D->getType();
1217 else if (const auto *D = dyn_cast<TypedefNameDecl>(this))
1218 Ty = D->getUnderlyingType();
1219 else
1220 return false;
1221
1223}
1224
1226 assert(getDeclContext());
1228}
1229
1230/// Starting at a given context (a Decl or DeclContext), look for a
1231/// code context that is not a closure (a lambda, block, etc.).
1232template <class T> static Decl *getNonClosureContext(T *D) {
1233 if (getKind(D) == Decl::CXXMethod) {
1234 auto *MD = cast<CXXMethodDecl>(D);
1235 if (MD->getOverloadedOperator() == OO_Call &&
1236 MD->getParent()->isLambda())
1237 return getNonClosureContext(MD->getParent()->getParent());
1238 return MD;
1239 }
1240 if (auto *FD = dyn_cast<FunctionDecl>(D))
1241 return FD;
1242 if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
1243 return MD;
1244 if (auto *BD = dyn_cast<BlockDecl>(D))
1245 return getNonClosureContext(BD->getParent());
1246 if (auto *CD = dyn_cast<CapturedDecl>(D))
1247 return getNonClosureContext(CD->getParent());
1248 return nullptr;
1249}
1250
1252 return ::getNonClosureContext(this);
1253}
1254
1256 return ::getNonClosureContext(this);
1257}
1258
1259//===----------------------------------------------------------------------===//
1260// DeclContext Implementation
1261//===----------------------------------------------------------------------===//
1262
1264 DeclContextBits.DeclKind = K;
1267 setNeedToReconcileExternalVisibleStorage(false);
1268 setHasLazyLocalLexicalLookups(false);
1269 setHasLazyExternalLexicalLookups(false);
1270 setUseQualifiedLookup(false);
1271}
1272
1274 Decl::Kind DK = D->getKind();
1275 switch (DK) {
1276#define DECL(NAME, BASE)
1277#define DECL_CONTEXT(NAME) case Decl::NAME:
1278#include "clang/AST/DeclNodes.inc"
1279 return true;
1280 default:
1281 return false;
1282 }
1283}
1284
1285DeclContext::~DeclContext() = default;
1286
1287/// Find the parent context of this context that will be
1288/// used for unqualified name lookup.
1289///
1290/// Generally, the parent lookup context is the semantic context. However, for
1291/// a friend function the parent lookup context is the lexical context, which
1292/// is the class in which the friend is declared.
1294 // FIXME: Find a better way to identify friends.
1295 if (isa<FunctionDecl>(this))
1298 return getLexicalParent();
1299
1300 // A lookup within the call operator of a lambda never looks in the lambda
1301 // class; instead, skip to the context in which that closure type is
1302 // declared.
1303 if (isLambdaCallOperator(this))
1304 return getParent()->getParent();
1305
1306 return getParent();
1307}
1308
1310 const DeclContext *Ctx = this;
1311
1312 do {
1313 if (Ctx->isClosure())
1314 return cast<BlockDecl>(Ctx);
1315 Ctx = Ctx->getParent();
1316 } while (Ctx);
1317
1318 return nullptr;
1319}
1320
1322 return isNamespace() &&
1323 cast<NamespaceDecl>(this)->isInline();
1324}
1325
1327 if (!isNamespace())
1328 return false;
1329
1330 const auto *ND = cast<NamespaceDecl>(this);
1331 if (ND->isInline()) {
1332 return ND->getParent()->isStdNamespace();
1333 }
1334
1336 return false;
1337
1338 const IdentifierInfo *II = ND->getIdentifier();
1339 return II && II->isStr("std");
1340}
1341
1343 if (isFileContext())
1344 return false;
1345
1346 if (isa<ClassTemplatePartialSpecializationDecl>(this))
1347 return true;
1348
1349 if (const auto *Record = dyn_cast<CXXRecordDecl>(this)) {
1350 if (Record->getDescribedClassTemplate())
1351 return true;
1352
1353 if (Record->isDependentLambda())
1354 return true;
1355 if (Record->isNeverDependentLambda())
1356 return false;
1357 }
1358
1359 if (const auto *Function = dyn_cast<FunctionDecl>(this)) {
1360 if (Function->getDescribedFunctionTemplate())
1361 return true;
1362
1363 // Friend function declarations are dependent if their *lexical*
1364 // context is dependent.
1365 if (cast<Decl>(this)->getFriendObjectKind())
1367 }
1368
1369 // FIXME: A variable template is a dependent context, but is not a
1370 // DeclContext. A context within it (such as a lambda-expression)
1371 // should be considered dependent.
1372
1373 return getParent() && getParent()->isDependentContext();
1374}
1375
1377 if (getDeclKind() == Decl::Enum)
1378 return !cast<EnumDecl>(this)->isScoped();
1379
1380 return isa<LinkageSpecDecl, ExportDecl, HLSLBufferDecl>(this);
1381}
1382
1383static bool isLinkageSpecContext(const DeclContext *DC,
1385 while (DC->getDeclKind() != Decl::TranslationUnit) {
1386 if (DC->getDeclKind() == Decl::LinkageSpec)
1387 return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
1388 DC = DC->getLexicalParent();
1389 }
1390 return false;
1391}
1392
1395}
1396
1398 const DeclContext *DC = this;
1399 while (DC->getDeclKind() != Decl::TranslationUnit) {
1400 if (DC->getDeclKind() == Decl::LinkageSpec &&
1401 cast<LinkageSpecDecl>(DC)->getLanguage() == LinkageSpecLanguageIDs::C)
1402 return cast<LinkageSpecDecl>(DC);
1403 DC = DC->getLexicalParent();
1404 }
1405 return nullptr;
1406}
1407
1410}
1411
1412bool DeclContext::Encloses(const DeclContext *DC) const {
1413 if (getPrimaryContext() != this)
1414 return getPrimaryContext()->Encloses(DC);
1415
1416 for (; DC; DC = DC->getParent())
1417 if (!isa<LinkageSpecDecl>(DC) && !isa<ExportDecl>(DC) &&
1418 DC->getPrimaryContext() == this)
1419 return true;
1420 return false;
1421}
1422
1424 DeclContext *DC = this;
1425 while (DC->isTransparentContext()) {
1426 DC = DC->getParent();
1427 assert(DC && "All transparent contexts should have a parent!");
1428 }
1429 return DC;
1430}
1431
1433 switch (getDeclKind()) {
1434 case Decl::ExternCContext:
1435 case Decl::LinkageSpec:
1436 case Decl::Export:
1437 case Decl::TopLevelStmt:
1438 case Decl::Block:
1439 case Decl::Captured:
1440 case Decl::OMPDeclareReduction:
1441 case Decl::OMPDeclareMapper:
1442 case Decl::RequiresExprBody:
1443 // There is only one DeclContext for these entities.
1444 return this;
1445
1446 case Decl::HLSLBuffer:
1447 // Each buffer, even with the same name, is a distinct construct.
1448 // Multiple buffers with the same name are allowed for backward
1449 // compatibility.
1450 // As long as buffers have unique resource bindings the names don't matter.
1451 // The names get exposed via the CPU-side reflection API which
1452 // supports querying bindings, so we cannot remove them.
1453 return this;
1454
1455 case Decl::TranslationUnit:
1456 return static_cast<TranslationUnitDecl *>(this)->getFirstDecl();
1457 case Decl::Namespace:
1458 return static_cast<NamespaceDecl *>(this)->getFirstDecl();
1459
1460 case Decl::ObjCMethod:
1461 return this;
1462
1463 case Decl::ObjCInterface:
1464 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(this))
1465 if (auto *Def = OID->getDefinition())
1466 return Def;
1467 return this;
1468
1469 case Decl::ObjCProtocol:
1470 if (auto *OPD = dyn_cast<ObjCProtocolDecl>(this))
1471 if (auto *Def = OPD->getDefinition())
1472 return Def;
1473 return this;
1474
1475 case Decl::ObjCCategory:
1476 return this;
1477
1478 case Decl::ObjCImplementation:
1479 case Decl::ObjCCategoryImpl:
1480 return this;
1481
1482 default:
1483 if (getDeclKind() >= Decl::firstTag && getDeclKind() <= Decl::lastTag) {
1484 // If this is a tag type that has a definition or is currently
1485 // being defined, that definition is our primary context.
1486 auto *Tag = cast<TagDecl>(this);
1487
1488 if (TagDecl *Def = Tag->getDefinition())
1489 return Def;
1490
1491 if (const auto *TagTy = dyn_cast<TagType>(Tag->getTypeForDecl())) {
1492 // Note, TagType::getDecl returns the (partial) definition one exists.
1493 TagDecl *PossiblePartialDef = TagTy->getDecl();
1494 if (PossiblePartialDef->isBeingDefined())
1495 return PossiblePartialDef;
1496 } else {
1497 assert(isa<InjectedClassNameType>(Tag->getTypeForDecl()));
1498 }
1499
1500 return Tag;
1501 }
1502
1503 assert(getDeclKind() >= Decl::firstFunction &&
1504 getDeclKind() <= Decl::lastFunction &&
1505 "Unknown DeclContext kind");
1506 return this;
1507 }
1508}
1509
1510template <typename T>
1513 for (T *D = Self->getMostRecentDecl(); D; D = D->getPreviousDecl())
1514 Contexts.push_back(D);
1515
1516 std::reverse(Contexts.begin(), Contexts.end());
1517}
1518
1520 Contexts.clear();
1521
1522 Decl::Kind Kind = getDeclKind();
1523
1524 if (Kind == Decl::TranslationUnit)
1525 collectAllContextsImpl(static_cast<TranslationUnitDecl *>(this), Contexts);
1526 else if (Kind == Decl::Namespace)
1527 collectAllContextsImpl(static_cast<NamespaceDecl *>(this), Contexts);
1528 else
1529 Contexts.push_back(this);
1530}
1531
1532std::pair<Decl *, Decl *>
1534 bool FieldsAlreadyLoaded) {
1535 // Build up a chain of declarations via the Decl::NextInContextAndBits field.
1536 Decl *FirstNewDecl = nullptr;
1537 Decl *PrevDecl = nullptr;
1538 for (auto *D : Decls) {
1539 if (FieldsAlreadyLoaded && isa<FieldDecl>(D))
1540 continue;
1541
1542 if (PrevDecl)
1543 PrevDecl->NextInContextAndBits.setPointer(D);
1544 else
1545 FirstNewDecl = D;
1546
1547 PrevDecl = D;
1548 }
1549
1550 return std::make_pair(FirstNewDecl, PrevDecl);
1551}
1552
1553/// We have just acquired external visible storage, and we already have
1554/// built a lookup map. For every name in the map, pull in the new names from
1555/// the external storage.
1556void DeclContext::reconcileExternalVisibleStorage() const {
1557 assert(hasNeedToReconcileExternalVisibleStorage() && LookupPtr);
1558 setNeedToReconcileExternalVisibleStorage(false);
1559
1560 for (auto &Lookup : *LookupPtr)
1561 Lookup.second.setHasExternalDecls();
1562}
1563
1564/// Load the declarations within this lexical storage from an
1565/// external source.
1566/// \return \c true if any declarations were added.
1567bool
1568DeclContext::LoadLexicalDeclsFromExternalStorage() const {
1570 assert(hasExternalLexicalStorage() && Source && "No external storage?");
1571
1572 // Notify that we have a DeclContext that is initializing.
1573 ExternalASTSource::Deserializing ADeclContext(Source);
1574
1575 // Load the external declarations, if any.
1578 Source->FindExternalLexicalDecls(this, Decls);
1579
1580 if (Decls.empty())
1581 return false;
1582
1583 // We may have already loaded just the fields of this record, in which case
1584 // we need to ignore them.
1585 bool FieldsAlreadyLoaded = false;
1586 if (const auto *RD = dyn_cast<RecordDecl>(this))
1587 FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1588
1589 // Splice the newly-read declarations into the beginning of the list
1590 // of declarations.
1591 Decl *ExternalFirst, *ExternalLast;
1592 std::tie(ExternalFirst, ExternalLast) =
1593 BuildDeclChain(Decls, FieldsAlreadyLoaded);
1594 ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
1595 FirstDecl = ExternalFirst;
1596 if (!LastDecl)
1597 LastDecl = ExternalLast;
1598 return true;
1599}
1600
1603 DeclarationName Name) {
1604 ASTContext &Context = DC->getParentASTContext();
1605 StoredDeclsMap *Map;
1606 if (!(Map = DC->LookupPtr))
1607 Map = DC->CreateStoredDeclsMap(Context);
1608 if (DC->hasNeedToReconcileExternalVisibleStorage())
1609 DC->reconcileExternalVisibleStorage();
1610
1611 (*Map)[Name].removeExternalDecls();
1612
1614}
1615
1618 DeclarationName Name,
1619 ArrayRef<NamedDecl*> Decls) {
1620 ASTContext &Context = DC->getParentASTContext();
1621 StoredDeclsMap *Map;
1622 if (!(Map = DC->LookupPtr))
1623 Map = DC->CreateStoredDeclsMap(Context);
1624 if (DC->hasNeedToReconcileExternalVisibleStorage())
1625 DC->reconcileExternalVisibleStorage();
1626
1627 StoredDeclsList &List = (*Map)[Name];
1628 List.replaceExternalDecls(Decls);
1629 return List.getLookupResult();
1630}
1631
1634 LoadLexicalDeclsFromExternalStorage();
1635 return decl_iterator(FirstDecl);
1636}
1637
1640 LoadLexicalDeclsFromExternalStorage();
1641
1642 return !FirstDecl;
1643}
1644
1646 return (D->getLexicalDeclContext() == this &&
1647 (D->NextInContextAndBits.getPointer() || D == LastDecl));
1648}
1649
1652 LoadLexicalDeclsFromExternalStorage();
1653 return containsDecl(D);
1654}
1655
1656/// shouldBeHidden - Determine whether a declaration which was declared
1657/// within its semantic context should be invisible to qualified name lookup.
1659 // Skip unnamed declarations.
1660 if (!D->getDeclName())
1661 return true;
1662
1663 // Skip entities that can't be found by name lookup into a particular
1664 // context.
1665 if ((D->getIdentifierNamespace() == 0 && !isa<UsingDirectiveDecl>(D)) ||
1667 return true;
1668
1669 // Skip friends and local extern declarations unless they're the first
1670 // declaration of the entity.
1671 if ((D->isLocalExternDecl() || D->getFriendObjectKind()) &&
1672 D != D->getCanonicalDecl())
1673 return true;
1674
1675 // Skip template specializations.
1676 // FIXME: This feels like a hack. Should DeclarationName support
1677 // template-ids, or is there a better way to keep specializations
1678 // from being visible?
1679 if (isa<ClassTemplateSpecializationDecl>(D))
1680 return true;
1681 if (auto *FD = dyn_cast<FunctionDecl>(D))
1682 if (FD->isFunctionTemplateSpecialization())
1683 return true;
1684
1685 // Hide destructors that are invalid. There should always be one destructor,
1686 // but if it is an invalid decl, another one is created. We need to hide the
1687 // invalid one from places that expect exactly one destructor, like the
1688 // serialization code.
1689 if (isa<CXXDestructorDecl>(D) && D->isInvalidDecl())
1690 return true;
1691
1692 return false;
1693}
1694
1696 assert(D->getLexicalDeclContext() == this &&
1697 "decl being removed from non-lexical context");
1698 assert((D->NextInContextAndBits.getPointer() || D == LastDecl) &&
1699 "decl is not in decls list");
1700
1701 // Remove D from the decl chain. This is O(n) but hopefully rare.
1702 if (D == FirstDecl) {
1703 if (D == LastDecl)
1704 FirstDecl = LastDecl = nullptr;
1705 else
1706 FirstDecl = D->NextInContextAndBits.getPointer();
1707 } else {
1708 for (Decl *I = FirstDecl; true; I = I->NextInContextAndBits.getPointer()) {
1709 assert(I && "decl not found in linked list");
1710 if (I->NextInContextAndBits.getPointer() == D) {
1711 I->NextInContextAndBits.setPointer(D->NextInContextAndBits.getPointer());
1712 if (D == LastDecl) LastDecl = I;
1713 break;
1714 }
1715 }
1716 }
1717
1718 // Mark that D is no longer in the decl chain.
1719 D->NextInContextAndBits.setPointer(nullptr);
1720
1721 // Remove D from the lookup table if necessary.
1722 if (isa<NamedDecl>(D)) {
1723 auto *ND = cast<NamedDecl>(D);
1724
1725 // Do not try to remove the declaration if that is invisible to qualified
1726 // lookup. E.g. template specializations are skipped.
1727 if (shouldBeHidden(ND))
1728 return;
1729
1730 // Remove only decls that have a name
1731 if (!ND->getDeclName())
1732 return;
1733
1734 auto *DC = D->getDeclContext();
1735 do {
1736 StoredDeclsMap *Map = DC->getPrimaryContext()->LookupPtr;
1737 if (Map) {
1738 StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1739 assert(Pos != Map->end() && "no lookup entry for decl");
1740 StoredDeclsList &List = Pos->second;
1741 List.remove(ND);
1742 // Clean up the entry if there are no more decls.
1743 if (List.isNull())
1744 Map->erase(Pos);
1745 }
1746 } while (DC->isTransparentContext() && (DC = DC->getParent()));
1747 }
1748}
1749
1751 assert(D->getLexicalDeclContext() == this &&
1752 "Decl inserted into wrong lexical context");
1753 assert(!D->getNextDeclInContext() && D != LastDecl &&
1754 "Decl already inserted into a DeclContext");
1755
1756 if (FirstDecl) {
1757 LastDecl->NextInContextAndBits.setPointer(D);
1758 LastDecl = D;
1759 } else {
1760 FirstDecl = LastDecl = D;
1761 }
1762
1763 // Notify a C++ record declaration that we've added a member, so it can
1764 // update its class-specific state.
1765 if (auto *Record = dyn_cast<CXXRecordDecl>(this))
1766 Record->addedMember(D);
1767
1768 // If this is a newly-created (not de-serialized) import declaration, wire
1769 // it in to the list of local import declarations.
1770 if (!D->isFromASTFile()) {
1771 if (auto *Import = dyn_cast<ImportDecl>(D))
1773 }
1774}
1775
1778
1779 if (auto *ND = dyn_cast<NamedDecl>(D))
1780 ND->getDeclContext()->getPrimaryContext()->
1781 makeDeclVisibleInContextWithFlags(ND, false, true);
1782}
1783
1786
1787 if (auto *ND = dyn_cast<NamedDecl>(D))
1788 ND->getDeclContext()->getPrimaryContext()->
1789 makeDeclVisibleInContextWithFlags(ND, true, true);
1790}
1791
1792/// buildLookup - Build the lookup data structure with all of the
1793/// declarations in this DeclContext (and any other contexts linked
1794/// to it or transparent contexts nested within it) and return it.
1795///
1796/// Note that the produced map may miss out declarations from an
1797/// external source. If it does, those entries will be marked with
1798/// the 'hasExternalDecls' flag.
1800 assert(this == getPrimaryContext() && "buildLookup called on non-primary DC");
1801
1802 if (!hasLazyLocalLexicalLookups() &&
1803 !hasLazyExternalLexicalLookups())
1804 return LookupPtr;
1805
1807 collectAllContexts(Contexts);
1808
1809 if (hasLazyExternalLexicalLookups()) {
1810 setHasLazyExternalLexicalLookups(false);
1811 for (auto *DC : Contexts) {
1812 if (DC->hasExternalLexicalStorage()) {
1813 bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1814 setHasLazyLocalLexicalLookups(
1815 hasLazyLocalLexicalLookups() | LoadedDecls );
1816 }
1817 }
1818
1819 if (!hasLazyLocalLexicalLookups())
1820 return LookupPtr;
1821 }
1822
1823 for (auto *DC : Contexts)
1824 buildLookupImpl(DC, hasExternalVisibleStorage());
1825
1826 // We no longer have any lazy decls.
1827 setHasLazyLocalLexicalLookups(false);
1828 return LookupPtr;
1829}
1830
1831/// buildLookupImpl - Build part of the lookup data structure for the
1832/// declarations contained within DCtx, which will either be this
1833/// DeclContext, a DeclContext linked to it, or a transparent context
1834/// nested within it.
1835void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) {
1836 for (auto *D : DCtx->noload_decls()) {
1837 // Insert this declaration into the lookup structure, but only if
1838 // it's semantically within its decl context. Any other decls which
1839 // should be found in this context are added eagerly.
1840 //
1841 // If it's from an AST file, don't add it now. It'll get handled by
1842 // FindExternalVisibleDeclsByName if needed. Exception: if we're not
1843 // in C++, we do not track external visible decls for the TU, so in
1844 // that case we need to collect them all here.
1845 if (auto *ND = dyn_cast<NamedDecl>(D))
1846 if (ND->getDeclContext() == DCtx && !shouldBeHidden(ND) &&
1847 (!ND->isFromASTFile() ||
1848 (isTranslationUnit() &&
1849 !getParentASTContext().getLangOpts().CPlusPlus)))
1850 makeDeclVisibleInContextImpl(ND, Internal);
1851
1852 // If this declaration is itself a transparent declaration context
1853 // or inline namespace, add the members of this declaration of that
1854 // context (recursively).
1855 if (auto *InnerCtx = dyn_cast<DeclContext>(D))
1856 if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1857 buildLookupImpl(InnerCtx, Internal);
1858 }
1859}
1860
1863 // For transparent DeclContext, we should lookup in their enclosing context.
1864 if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export)
1865 return getParent()->lookup(Name);
1866
1867 return getPrimaryContext()->lookupImpl(Name, this);
1868}
1869
1871DeclContext::lookupImpl(DeclarationName Name,
1872 const DeclContext *OriginalLookupDC) const {
1873 assert(this == getPrimaryContext() &&
1874 "lookupImpl should only be called with primary DC!");
1875 assert(getDeclKind() != Decl::LinkageSpec && getDeclKind() != Decl::Export &&
1876 "We shouldn't lookup in transparent DC.");
1877
1878 // If we have an external source, ensure that any later redeclarations of this
1879 // context have been loaded, since they may add names to the result of this
1880 // lookup (or add external visible storage).
1882 if (Source)
1883 (void)cast<Decl>(this)->getMostRecentDecl();
1884
1886 assert(Source && "external visible storage but no external source?");
1887
1888 if (hasNeedToReconcileExternalVisibleStorage())
1889 reconcileExternalVisibleStorage();
1890
1892
1893 if (hasLazyLocalLexicalLookups() ||
1894 hasLazyExternalLexicalLookups())
1895 // FIXME: Make buildLookup const?
1896 Map = const_cast<DeclContext*>(this)->buildLookup();
1897
1898 if (!Map)
1899 Map = CreateStoredDeclsMap(getParentASTContext());
1900
1901 // If we have a lookup result with no external decls, we are done.
1902 std::pair<StoredDeclsMap::iterator, bool> R =
1903 Map->insert(std::make_pair(Name, StoredDeclsList()));
1904 if (!R.second && !R.first->second.hasExternalDecls())
1905 return R.first->second.getLookupResult();
1906
1907 if (Source->FindExternalVisibleDeclsByName(this, Name, OriginalLookupDC) ||
1908 !R.second) {
1909 if (StoredDeclsMap *Map = LookupPtr) {
1910 StoredDeclsMap::iterator I = Map->find(Name);
1911 if (I != Map->end())
1912 return I->second.getLookupResult();
1913 }
1914 }
1915
1916 return {};
1917 }
1918
1920 if (hasLazyLocalLexicalLookups() ||
1921 hasLazyExternalLexicalLookups())
1922 Map = const_cast<DeclContext*>(this)->buildLookup();
1923
1924 if (!Map)
1925 return {};
1926
1927 StoredDeclsMap::iterator I = Map->find(Name);
1928 if (I == Map->end())
1929 return {};
1930
1931 return I->second.getLookupResult();
1932}
1933
1936 // For transparent DeclContext, we should lookup in their enclosing context.
1937 if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export)
1938 return getParent()->noload_lookup(Name);
1939
1940 DeclContext *PrimaryContext = getPrimaryContext();
1941 if (PrimaryContext != this)
1942 return PrimaryContext->noload_lookup(Name);
1943
1944 loadLazyLocalLexicalLookups();
1946 if (!Map)
1947 return {};
1948
1949 StoredDeclsMap::iterator I = Map->find(Name);
1950 return I != Map->end() ? I->second.getLookupResult()
1951 : lookup_result();
1952}
1953
1954// If we have any lazy lexical declarations not in our lookup map, add them
1955// now. Don't import any external declarations, not even if we know we have
1956// some missing from the external visible lookups.
1957void DeclContext::loadLazyLocalLexicalLookups() {
1958 if (hasLazyLocalLexicalLookups()) {
1960 collectAllContexts(Contexts);
1961 for (auto *Context : Contexts)
1962 buildLookupImpl(Context, hasExternalVisibleStorage());
1963 setHasLazyLocalLexicalLookups(false);
1964 }
1965}
1966
1969 Results.clear();
1970
1971 // If there's no external storage, just perform a normal lookup and copy
1972 // the results.
1974 lookup_result LookupResults = lookup(Name);
1975 Results.insert(Results.end(), LookupResults.begin(), LookupResults.end());
1976 if (!Results.empty())
1977 return;
1978 }
1979
1980 // If we have a lookup table, check there first. Maybe we'll get lucky.
1981 // FIXME: Should we be checking these flags on the primary context?
1982 if (Name && !hasLazyLocalLexicalLookups() &&
1983 !hasLazyExternalLexicalLookups()) {
1984 if (StoredDeclsMap *Map = LookupPtr) {
1985 StoredDeclsMap::iterator Pos = Map->find(Name);
1986 if (Pos != Map->end()) {
1987 Results.insert(Results.end(),
1988 Pos->second.getLookupResult().begin(),
1989 Pos->second.getLookupResult().end());
1990 return;
1991 }
1992 }
1993 }
1994
1995 // Slow case: grovel through the declarations in our chain looking for
1996 // matches.
1997 // FIXME: If we have lazy external declarations, this will not find them!
1998 // FIXME: Should we CollectAllContexts and walk them all here?
1999 for (Decl *D = FirstDecl; D; D = D->getNextDeclInContext()) {
2000 if (auto *ND = dyn_cast<NamedDecl>(D))
2001 if (ND->getDeclName() == Name)
2002 Results.push_back(ND);
2003 }
2004}
2005
2007 DeclContext *Ctx = this;
2008
2009 // In C, a record type is the redeclaration context for its fields only. If
2010 // we arrive at a record context after skipping anything else, we should skip
2011 // the record as well. Currently, this means skipping enumerations because
2012 // they're the only transparent context that can exist within a struct or
2013 // union.
2014 bool SkipRecords = getDeclKind() == Decl::Kind::Enum &&
2015 !getParentASTContext().getLangOpts().CPlusPlus;
2016
2017 // Skip through contexts to get to the redeclaration context. Transparent
2018 // contexts are always skipped.
2019 while ((SkipRecords && Ctx->isRecord()) || Ctx->isTransparentContext())
2020 Ctx = Ctx->getParent();
2021 return Ctx;
2022}
2023
2025 DeclContext *Ctx = this;
2026 // Skip through non-namespace, non-translation-unit contexts.
2027 while (!Ctx->isFileContext())
2028 Ctx = Ctx->getParent();
2029 return Ctx->getPrimaryContext();
2030}
2031
2033 // Loop until we find a non-record context.
2034 RecordDecl *OutermostRD = nullptr;
2035 DeclContext *DC = this;
2036 while (DC->isRecord()) {
2037 OutermostRD = cast<RecordDecl>(DC);
2038 DC = DC->getLexicalParent();
2039 }
2040 return OutermostRD;
2041}
2042
2044 // For non-file contexts, this is equivalent to Equals.
2045 if (!isFileContext())
2046 return O->Equals(this);
2047
2048 do {
2049 if (O->Equals(this))
2050 return true;
2051
2052 const auto *NS = dyn_cast<NamespaceDecl>(O);
2053 if (!NS || !NS->isInline())
2054 break;
2055 O = NS->getParent();
2056 } while (O);
2057
2058 return false;
2059}
2060
2062 DeclContext *PrimaryDC = this->getPrimaryContext();
2064 // If the decl is being added outside of its semantic decl context, we
2065 // need to ensure that we eagerly build the lookup information for it.
2066 PrimaryDC->makeDeclVisibleInContextWithFlags(D, false, PrimaryDC == DeclDC);
2067}
2068
2069void DeclContext::makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal,
2070 bool Recoverable) {
2071 assert(this == getPrimaryContext() && "expected a primary DC");
2072
2073 if (!isLookupContext()) {
2076 ->makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
2077 return;
2078 }
2079
2080 // Skip declarations which should be invisible to name lookup.
2081 if (shouldBeHidden(D))
2082 return;
2083
2084 // If we already have a lookup data structure, perform the insertion into
2085 // it. If we might have externally-stored decls with this name, look them
2086 // up and perform the insertion. If this decl was declared outside its
2087 // semantic context, buildLookup won't add it, so add it now.
2088 //
2089 // FIXME: As a performance hack, don't add such decls into the translation
2090 // unit unless we're in C++, since qualified lookup into the TU is never
2091 // performed.
2093 ((!Recoverable || D->getDeclContext() != D->getLexicalDeclContext()) &&
2094 (getParentASTContext().getLangOpts().CPlusPlus ||
2095 !isTranslationUnit()))) {
2096 // If we have lazily omitted any decls, they might have the same name as
2097 // the decl which we are adding, so build a full lookup table before adding
2098 // this decl.
2099 buildLookup();
2100 makeDeclVisibleInContextImpl(D, Internal);
2101 } else {
2102 setHasLazyLocalLexicalLookups(true);
2103 }
2104
2105 // If we are a transparent context or inline namespace, insert into our
2106 // parent context, too. This operation is recursive.
2109 makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
2110
2111 auto *DCAsDecl = cast<Decl>(this);
2112 // Notify that a decl was made visible unless we are a Tag being defined.
2113 if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
2114 if (ASTMutationListener *L = DCAsDecl->getASTMutationListener())
2115 L->AddedVisibleDecl(this, D);
2116}
2117
2118void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) {
2119 // Find or create the stored declaration map.
2121 if (!Map) {
2123 Map = CreateStoredDeclsMap(*C);
2124 }
2125
2126 // If there is an external AST source, load any declarations it knows about
2127 // with this declaration's name.
2128 // If the lookup table contains an entry about this name it means that we
2129 // have already checked the external source.
2130 if (!Internal)
2131 if (ExternalASTSource *Source = getParentASTContext().getExternalSource())
2133 Map->find(D->getDeclName()) == Map->end())
2134 Source->FindExternalVisibleDeclsByName(this, D->getDeclName(),
2135 D->getDeclContext());
2136
2137 // Insert this declaration into the map.
2138 StoredDeclsList &DeclNameEntries = (*Map)[D->getDeclName()];
2139
2140 if (Internal) {
2141 // If this is being added as part of loading an external declaration,
2142 // this may not be the only external declaration with this name.
2143 // In this case, we never try to replace an existing declaration; we'll
2144 // handle that when we finalize the list of declarations for this name.
2145 DeclNameEntries.setHasExternalDecls();
2146 DeclNameEntries.prependDeclNoReplace(D);
2147 return;
2148 }
2149
2150 DeclNameEntries.addOrReplaceDecl(D);
2151}
2152
2154 return cast<UsingDirectiveDecl>(*I);
2155}
2156
2157/// Returns iterator range [First, Last) of UsingDirectiveDecls stored within
2158/// this context.
2160 // FIXME: Use something more efficient than normal lookup for using
2161 // directives. In C++, using directives are looked up more than anything else.
2162 lookup_result Result = lookup(UsingDirectiveDecl::getName());
2163 return udir_range(Result.begin(), Result.end());
2164}
2165
2166//===----------------------------------------------------------------------===//
2167// Creation and Destruction of StoredDeclsMaps. //
2168//===----------------------------------------------------------------------===//
2169
2170StoredDeclsMap *DeclContext::CreateStoredDeclsMap(ASTContext &C) const {
2171 assert(!LookupPtr && "context already has a decls map");
2172 assert(getPrimaryContext() == this &&
2173 "creating decls map on non-primary context");
2174
2175 StoredDeclsMap *M;
2177 if (Dependent)
2178 M = new DependentStoredDeclsMap();
2179 else
2180 M = new StoredDeclsMap();
2181 M->Previous = C.LastSDM;
2182 C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M, Dependent);
2183 LookupPtr = M;
2184 return M;
2185}
2186
2187void ASTContext::ReleaseDeclContextMaps() {
2188 // It's okay to delete DependentStoredDeclsMaps via a StoredDeclsMap
2189 // pointer because the subclass doesn't add anything that needs to
2190 // be deleted.
2191 StoredDeclsMap::DestroyAll(LastSDM.getPointer(), LastSDM.getInt());
2192 LastSDM.setPointer(nullptr);
2193}
2194
2196 while (Map) {
2197 // Advance the iteration before we invalidate memory.
2198 llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
2199
2200 if (Dependent)
2201 delete static_cast<DependentStoredDeclsMap*>(Map);
2202 else
2203 delete Map;
2204
2205 Map = Next.getPointer();
2206 Dependent = Next.getInt();
2207 }
2208}
2209
2212 const PartialDiagnostic &PDiag) {
2213 assert(Parent->isDependentContext()
2214 && "cannot iterate dependent diagnostics of non-dependent context");
2215 Parent = Parent->getPrimaryContext();
2216 if (!Parent->LookupPtr)
2217 Parent->CreateStoredDeclsMap(C);
2218
2219 auto *Map = static_cast<DependentStoredDeclsMap *>(Parent->LookupPtr);
2220
2221 // Allocate the copy of the PartialDiagnostic via the ASTContext's
2222 // BumpPtrAllocator, rather than the ASTContext itself.
2223 DiagnosticStorage *DiagStorage = nullptr;
2224 if (PDiag.hasStorage())
2225 DiagStorage = new (C) DiagnosticStorage;
2226
2227 auto *DD = new (C) DependentDiagnostic(PDiag, DiagStorage);
2228
2229 // TODO: Maybe we shouldn't reverse the order during insertion.
2230 DD->NextDiagnostic = Map->FirstDiagnostic;
2231 Map->FirstDiagnostic = DD;
2232
2233 return DD;
2234}
2235
2237 return ID & llvm::maskTrailingOnes<DeclID>(32);
2238}
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3460
NodeId Parent
Definition: ASTDiff.cpp:191
This file provides some common utility functions for processing Lambda related AST Constructs.
const Decl * D
Expr * E
static bool shouldBeHidden(NamedDecl *D)
shouldBeHidden - Determine whether a declaration which was declared within its semantic context shoul...
Definition: DeclBase.cpp:1658
static void collectAllContextsImpl(T *Self, SmallVectorImpl< DeclContext * > &Contexts)
Definition: DeclBase.cpp:1511
static bool isLinkageSpecContext(const DeclContext *DC, LinkageSpecLanguageIDs ID)
Definition: DeclBase.cpp:1383
static Decl::Kind getKind(const Decl *D)
Definition: DeclBase.cpp:1180
static Decl * getNonClosureContext(T *D)
Starting at a given context (a Decl or DeclContext), look for a code context that is not a closure (a...
Definition: DeclBase.cpp:1232
static AvailabilityResult CheckAvailability(ASTContext &Context, const AvailabilityAttr *A, std::string *Message, VersionTuple EnclosingVersion)
Determine the availability of the given declaration based on the target platform.
Definition: DeclBase.cpp:652
static StringRef getRealizedPlatform(const AvailabilityAttr *A, const ASTContext &Context)
Definition: DeclBase.cpp:630
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::Record Record
Definition: MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::SourceLocation class and associated facilities.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
std::string Label
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
const ConstantArrayType * getAsConstantArrayType(QualType T) const
Definition: ASTContext.h:2922
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
Definition: ASTContext.h:1289
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
Definition: ASTContext.h:2928
const LangOptions & getLangOpts() const
Definition: ASTContext.h:834
llvm::BumpPtrAllocator & getAllocator() const
Definition: ASTContext.h:750
void eraseDeclAttrs(const Decl *D)
Erase the attributes corresponding to the given declaration.
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
void * Allocate(size_t Size, unsigned Align=8) const
Definition: ASTContext.h:754
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:799
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition: ASTContext.h:1274
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
Definition: ASTContext.h:1133
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Attr - This represents one attribute.
Definition: Attr.h:43
bool isInherited() const
Definition: Attr.h:101
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4496
Pointer to a block type.
Definition: Type.h:3408
The results of name lookup within a DeclContext.
Definition: DeclBase.h:1372
decl_iterator - Iterates through the declarations stored within this context.
Definition: DeclBase.h:2321
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition: DeclBase.h:2384
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1439
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:2104
udir_range using_directives() const
Returns iterator range [First, Last) of UsingDirectiveDecls stored within this context.
Definition: DeclBase.cpp:2159
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition: DeclBase.h:2233
bool isFileContext() const
Definition: DeclBase.h:2175
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
Definition: DeclBase.h:2697
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
Definition: DeclBase.cpp:2061
DeclContextLookupResult lookup_result
Definition: DeclBase.h:2568
static std::pair< Decl *, Decl * > BuildDeclChain(ArrayRef< Decl * > Decls, bool FieldsAlreadyLoaded)
Build up a chain of declarations.
Definition: DeclBase.cpp:1533
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Definition: DeclBase.cpp:1376
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
Definition: DeclBase.cpp:1255
ASTContext & getParentASTContext() const
Definition: DeclBase.h:2133
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1408
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
Definition: DeclBase.cpp:1342
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:2043
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
Definition: DeclBase.h:2120
bool isNamespace() const
Definition: DeclBase.h:2193
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
Definition: DeclBase.cpp:1862
bool isLookupContext() const
Test whether the context supports looking up names.
Definition: DeclBase.h:2170
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
Definition: DeclBase.cpp:1309
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
Definition: DeclBase.h:2691
const char * getDeclKindName() const
Definition: DeclBase.cpp:191
bool isTranslationUnit() const
Definition: DeclBase.h:2180
bool isRecord() const
Definition: DeclBase.h:2184
void collectAllContexts(SmallVectorImpl< DeclContext * > &Contexts)
Collects all of the declaration contexts that are semantically connected to this declaration context.
Definition: DeclBase.cpp:1519
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
Definition: DeclBase.cpp:2006
llvm::iterator_range< udir_iterator > udir_range
Definition: DeclBase.h:2645
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
Definition: DeclBase.h:2074
DeclContext(Decl::Kind K)
Definition: DeclBase.cpp:1263
void addDeclInternal(Decl *D)
Add the declaration D into this context, but suppress searches for external declarations with the sam...
Definition: DeclBase.cpp:1784
bool containsDeclAndLoad(Decl *D) const
Checks whether a declaration is in this context.
Definition: DeclBase.cpp:1650
void removeDecl(Decl *D)
Removes a declaration from this context.
Definition: DeclBase.cpp:1695
void addDecl(Decl *D)
Add the declaration D into this context.
Definition: DeclBase.cpp:1776
StoredDeclsMap * buildLookup()
Ensure the lookup structure is fully-built and return it.
Definition: DeclBase.cpp:1799
bool hasValidDeclKind() const
Definition: DeclBase.cpp:182
bool isStdNamespace() const
Definition: DeclBase.cpp:1326
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:1935
static bool classof(const Decl *D)
Definition: DeclBase.cpp:1273
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
Definition: DeclBase.cpp:1645
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition: DeclBase.h:2679
void setUseQualifiedLookup(bool use=true) const
Definition: DeclBase.h:2710
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
Definition: DeclBase.cpp:2024
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
Definition: DeclBase.h:2080
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
Definition: DeclBase.h:2372
friend class DependentDiagnostic
For CreateStoredDeclsMap.
Definition: DeclBase.h:1448
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
Definition: DeclBase.cpp:1432
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
Definition: DeclBase.cpp:2032
bool decls_empty() const
Definition: DeclBase.cpp:1638
bool isInlineNamespace() const
Definition: DeclBase.cpp:1321
DeclContextBitfields DeclContextBits
Definition: DeclBase.h:2033
bool isFunctionOrMethod() const
Definition: DeclBase.h:2156
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition: DeclBase.h:2685
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
Definition: DeclBase.cpp:1293
StoredDeclsMap * LookupPtr
Pointer to the data structure used to lookup declarations within this context (or a DependentStoredDe...
Definition: DeclBase.h:2021
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1393
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
Definition: DeclBase.cpp:1397
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context encloses the declaration context DC.
Definition: DeclBase.cpp:1412
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
Definition: DeclBase.cpp:1750
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:1967
Decl::Kind getDeclKind() const
Definition: DeclBase.h:2097
DeclContext * getNonTransparentContext()
Definition: DeclBase.cpp:1423
decl_iterator decls_begin() const
Definition: DeclBase.cpp:1632
unsigned getLocalDeclIndex() const
Definition: DeclBase.cpp:2236
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition: DeclBase.h:1054
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition: DeclBase.h:1069
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:322
bool isInStdNamespace() const
Definition: DeclBase.cpp:430
bool isInCurrentModuleUnit() const
Whether this declaration comes from the same module unit being compiled.
Definition: DeclBase.cpp:1147
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
Definition: DeclBase.cpp:266
bool isTemplateDecl() const
returns true if this declaration is a template
Definition: DeclBase.cpp:262
static void add(Kind k)
Definition: DeclBase.cpp:229
Module * getTopLevelOwningNamedModule() const
Get the top level owning named module that owns this declaration if any.
Definition: DeclBase.cpp:133
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition: DeclBase.h:1219
bool isFromGlobalModule() const
Whether this declaration comes from global module.
Definition: DeclBase.cpp:1168
bool hasAttrs() const
Definition: DeclBase.h:521
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:528
void setOwningModuleID(unsigned ID)
Set the owning module ID.
Definition: DeclBase.cpp:126
void addAttr(Attr *A)
Definition: DeclBase.cpp:1018
void setAttrs(const AttrVec &Attrs)
Definition: DeclBase.h:523
bool hasLocalOwningModuleStorage() const
Definition: DeclBase.cpp:146
bool isFunctionPointerType() const
Definition: DeclBase.cpp:1213
bool isInNamedModule() const
Whether this declaration comes from a named module.
Definition: DeclBase.cpp:1172
virtual ~Decl()
ExternalSourceSymbolAttr * getExternalSourceSymbolAttr() const
Looks on this and related declarations for an applicable external source symbol attribute.
Definition: DeclBase.cpp:594
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
Definition: DeclBase.cpp:848
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
Definition: DeclBase.h:869
bool isParameterPack() const
Whether this declaration is a parameter pack.
Definition: DeclBase.cpp:247
ASTMutationListener * getASTMutationListener() const
Definition: DeclBase.cpp:538
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
Definition: DeclBase.cpp:542
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
Definition: DeclBase.cpp:753
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition: DeclBase.cpp:159
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
static unsigned getIdentifierNamespaceForKind(Kind DK)
Definition: DeclBase.cpp:867
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:1080
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition: DeclBase.cpp:572
bool isFileContextDecl() const
Definition: DeclBase.cpp:435
static Decl * castFromDeclContext(const DeclContext *)
Definition: DeclBase.cpp:1046
Decl * getNextDeclInContext()
Definition: DeclBase.h:448
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
Definition: DeclBase.cpp:289
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
Definition: DeclBase.cpp:1117
SourceLocation getBodyRBrace() const
getBodyRBrace - Gets the right brace of the body, if a body exists.
Definition: DeclBase.cpp:1072
int64_t getID() const
Definition: DeclBase.cpp:1183
bool isReferenced() const
Whether any declaration of this entity was referenced.
Definition: DeclBase.cpp:582
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
Definition: DeclBase.cpp:1187
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
Definition: DeclBase.cpp:1126
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:301
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
Definition: DeclBase.cpp:1164
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition: DeclBase.cpp:254
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:819
void dropAttrs()
Definition: DeclBase.cpp:1011
static DeclContext * castToDeclContext(const Decl *)
Definition: DeclBase.cpp:1059
const TemplateParameterList * getDescribedTemplateParams() const
If this is a declaration that describes some template or partial specialization, this returns the cor...
Definition: DeclBase.cpp:279
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition: DeclBase.h:786
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
Definition: DeclBase.cpp:403
const Attr * getDefiningAttr() const
Return this declaration's defining attribute if it has one.
Definition: DeclBase.cpp:620
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition: DeclBase.h:2784
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
Definition: DeclBase.cpp:1225
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
Definition: DeclBase.cpp:1251
bool isInvalidDecl() const
Definition: DeclBase.h:591
unsigned getIdentifierNamespace() const
Definition: DeclBase.h:882
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
Definition: DeclBase.cpp:615
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
Definition: DeclBase.h:1162
void setAccess(AccessSpecifier AS)
Definition: DeclBase.h:505
SourceLocation getLocation() const
Definition: DeclBase.h:442
const char * getDeclKindName() const
Definition: DeclBase.cpp:150
@ 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_Using
This declaration is a using declaration.
Definition: DeclBase.h:163
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
Definition: DeclBase.h:125
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
Definition: DeclBase.cpp:237
void setLocalOwningModule(Module *M)
Definition: DeclBase.h:822
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition: DeclBase.h:1042
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 isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition: DeclBase.cpp:557
DeclContext * getDeclContext()
Definition: DeclBase.h:451
attr_range attrs() const
Definition: DeclBase.h:538
bool isInAnonymousNamespace() const
Definition: DeclBase.cpp:420
static void EnableStatistics()
Definition: DeclBase.cpp:201
TranslationUnitDecl * getTranslationUnitDecl()
Definition: DeclBase.cpp:513
VersionTuple getVersionIntroduced() const
Retrieve the version of the target platform in which this declaration was introduced.
Definition: DeclBase.cpp:805
bool hasOwningModule() const
Is this declaration owned by some module?
Definition: DeclBase.h:830
bool isFromHeaderUnit() const
Whether this declaration comes from a header unit.
Definition: DeclBase.cpp:1176
static void PrintStats()
Definition: DeclBase.cpp:205
void updateOutOfDate(IdentifierInfo &II) const
Update a potentially out-of-date declaration.
Definition: DeclBase.cpp:60
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:440
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Definition: DeclBase.cpp:363
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:911
void setLexicalDeclContext(DeclContext *DC)
Definition: DeclBase.cpp:367
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclBase.h:971
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
Kind getKind() const
Definition: DeclBase.h:445
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition: DeclBase.h:874
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
Definition: DeclBase.cpp:534
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
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
Definition: DeclBase.cpp:1156
The name of a declaration.
A dependently-generated diagnostic.
static DependentDiagnostic * Create(ASTContext &Context, DeclContext *Parent, AccessNonce _, SourceLocation Loc, bool IsMemberAccess, AccessSpecifier AS, NamedDecl *TargetDecl, CXXRecordDecl *NamingClass, QualType BaseObjectType, const PartialDiagnostic &PDiag)
This represents one expression.
Definition: Expr.h:110
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:276
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Abstract interface for external sources of AST nodes.
virtual ExtKind hasExternalDefinitions(const Decl *D)
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
Definition: DeclBase.cpp:1617
static DeclContextLookupResult SetNoExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name)
Definition: DeclBase.cpp:1602
virtual Module * getModule(unsigned ID)
Retrieve the module that corresponds to the given module ID.
virtual bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC)
Find all declarations with the given name in the given context, and add them to the context by callin...
virtual void updateOutOfDateIdentifier(const IdentifierInfo &II)
Update an out-of-date identifier.
virtual void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Result)
Finds all declarations lexically contained within the given DeclContext, after applying an optional f...
Represents a member of a struct/union/class.
Definition: Decl.h:3033
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.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
bool trackLocalOwningModule() const
Do we need to track the owning module for a local declaration?
Definition: LangOptions.h:659
Represents a linkage specification.
Definition: DeclCXX.h:2957
Describes a module or submodule.
Definition: Module.h:115
bool isExplicitGlobalModule() const
Definition: Module.h:213
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition: Module.h:210
bool isHeaderUnit() const
Is this module a header unit.
Definition: Module.h:640
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Definition: Module.h:195
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition: Module.h:693
This represents a decl that may have a name.
Definition: Decl.h:253
Represent a C++ namespace.
Definition: Decl.h:551
The basic abstraction for the target Objective-C runtime.
Definition: ObjCRuntime.h:28
bool hasWeakClassImport() const
Does this runtime support weakly importing classes?
Definition: ObjCRuntime.h:378
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:3198
void print(raw_ostream &OS) const override
Definition: DeclBase.cpp:336
A (possibly-)qualified type.
Definition: Type.h:929
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: Type.h:996
QualType getCanonicalType() const
Definition: Type.h:7988
Represents a struct/union/class.
Definition: Decl.h:4162
Base for LValueReferenceType and RValueReferenceType.
Definition: Type.h:3439
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
void print(raw_ostream &OS, const SourceManager &SM) const
Stmt - This represents one statement.
Definition: Stmt.h:84
An array of decls optimized for the common case of only containing one entry.
void addOrReplaceDecl(NamedDecl *D)
If this is a redeclaration of an existing decl, replace the old one with D.
void prependDeclNoReplace(NamedDecl *D)
Add a declaration to the list without checking if it replaces anything.
static void DestroyAll(StoredDeclsMap *Map, bool Dependent)
Definition: DeclBase.cpp:2195
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3578
bool isBeingDefined() const
Return true if this decl is currently being defined.
Definition: Decl.h:3701
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1262
StringRef getPlatformName() const
Retrieve the name of the platform as it is used in the availability attribute.
Definition: TargetInfo.h:1666
VersionTuple getPlatformMinVersion() const
Retrieve the minimum desired version of the platform, to which the program should be compiled.
Definition: TargetInfo.h:1670
The base class of all kinds of template declarations (e.g., class, function, etc.).
Definition: DeclTemplate.h:398
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
ASTContext & getASTContext() const
Definition: Decl.h:120
Base wrapper for a particular "section" of type source info.
Definition: TypeLoc.h:59
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition: TypeLoc.h:89
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition: TypeLoc.h:2716
A container of type source information.
Definition: Type.h:7907
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition: TypeLoc.h:256
bool isBlockPointerType() const
Definition: Type.h:8205
bool isFunctionReferenceType() const
Definition: Type.h:8238
bool isFunctionPointerType() const
Definition: Type.h:8231
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:8805
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8736
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3427
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:3477
Wrapper for source info for typedefs.
Definition: TypeLoc.h:694
Represents C++ using-directive.
Definition: DeclCXX.h:3038
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Definition: AttrIterator.h:35
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
The JSON file list parser is used to communicate input to InstallAPI.
@ CPlusPlus
Definition: LangStandard.h:55
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
Definition: AttrIterator.h:30
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition: DeclCXX.h:2949
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition: ASTLambda.h:27
@ Result
The result type of a method or function.
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
const FunctionProtoType * T
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ AS_public
Definition: Specifiers.h:124
@ AS_none
Definition: Specifiers.h:127
UsingDirectiveDecl * operator*() const
Definition: DeclBase.cpp:2153