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