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