38#include "llvm/ADT/PointerIntPair.h"
39#include "llvm/ADT/StringRef.h"
40#include "llvm/Support/ErrorHandling.h"
41#include "llvm/Support/MathExtras.h"
42#include "llvm/Support/VersionTuple.h"
43#include "llvm/Support/raw_ostream.h"
57#define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
58#define ABSTRACT_DECL(DECL)
59#include "clang/AST/DeclNodes.inc"
61#define DECL(DERIVED, BASE) \
62 static_assert(alignof(Decl) >= alignof(DERIVED##Decl), \
63 "Alignment sufficient after objects prepended to " #DERIVED);
64#define ABSTRACT_DECL(DECL)
65#include "clang/AST/DeclNodes.inc"
67void *Decl::operator
new(std::size_t Size,
const ASTContext &Context,
71 static_assert(
sizeof(uint64_t) >=
alignof(
Decl),
"Decl won't be misaligned");
73 void *Result = (
char*)Start + 8;
75 uint64_t *PrefixPtr = (uint64_t *)Result - 1;
77 *PrefixPtr = ID.getRawValue();
81 assert(*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48));
86void *Decl::operator
new(std::size_t Size,
const ASTContext &Ctx,
88 assert(!
Parent || &
Parent->getParentASTContext() == &Ctx);
96 llvm::offsetToAlignment(
sizeof(
Module *), llvm::Align(
alignof(
Decl)));
97 auto *Buffer =
reinterpret_cast<char *
>(
98 ::operator
new(ExtraAlign +
sizeof(
Module *) + Size +
Extra, Ctx));
101 Parent ? cast<Decl>(
Parent)->getOwningModule() :
nullptr;
102 return new (Buffer)
Module*(ParentModule) + 1;
104 return ::operator
new(Size +
Extra, Ctx);
111 uint64_t ID = *((
const uint64_t *)
this - 1);
112 return GlobalDeclID(ID & llvm::maskTrailingOnes<uint64_t>(48));
119 uint64_t ID = *((
const uint64_t *)
this - 1);
124 assert(
isFromASTFile() &&
"Only works on a deserialized declaration");
125 uint64_t *IDAddress = (uint64_t *)
this - 1;
126 *IDAddress &= llvm::maskTrailingOnes<uint64_t>(48);
127 *IDAddress |= (uint64_t)ID << 48;
138Module *Decl::getOwningModuleSlow()
const {
149 default: llvm_unreachable(
"Declaration not in DeclNodes.inc!");
150#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
151#define ABSTRACT_DECL(DECL)
152#include "clang/AST/DeclNodes.inc"
158 assert(!isa<TagDecl>(
this) || !cast<TagDecl>(
this)->isCompleteDefinition());
163 if (!isa<ParmVarDecl>(
this)) {
172 if (
auto *DD = dyn_cast<DecompositionDecl>(
this)) {
173 for (
auto *Binding : DD->bindings()) {
174 Binding->setInvalidDecl();
181#define DECL(DERIVED, BASE) case Decl::DERIVED: return true;
182#define ABSTRACT_DECL(DECL)
183#include "clang/AST/DeclNodes.inc"
190#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
191#define ABSTRACT_DECL(DECL)
192#include "clang/AST/DeclNodes.inc"
194 llvm_unreachable(
"Declaration context not in DeclNodes.inc!");
197bool Decl::StatisticsEnabled =
false;
199 StatisticsEnabled =
true;
203 llvm::errs() <<
"\n*** Decl Stats:\n";
206#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
207#define ABSTRACT_DECL(DECL)
208#include "clang/AST/DeclNodes.inc"
209 llvm::errs() <<
" " << totalDecls <<
" decls total.\n";
212#define DECL(DERIVED, BASE) \
213 if (n##DERIVED##s > 0) { \
214 totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
215 llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
216 << sizeof(DERIVED##Decl) << " each (" \
217 << n##DERIVED##s * sizeof(DERIVED##Decl) \
220#define ABSTRACT_DECL(DECL)
221#include "clang/AST/DeclNodes.inc"
223 llvm::errs() <<
"Total bytes = " << totalBytes <<
"\n";
228#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
229#define ABSTRACT_DECL(DECL)
230#include "clang/AST/DeclNodes.inc"
235 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
this))
236 return TTP->isParameterPack();
237 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
this))
238 return NTTP->isParameterPack();
239 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
this))
240 return TTP->isParameterPack();
245 if (
const auto *Var = dyn_cast<ValueDecl>(
this))
246 return Var->isParameterPack();
252 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
254 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
255 return FTD->getTemplatedDecl();
260 return isa<TemplateDecl>(
this);
264 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
265 return FD->getDescribedFunctionTemplate();
266 if (
auto *RD = dyn_cast<CXXRecordDecl>(
this))
267 return RD->getDescribedClassTemplate();
268 if (
auto *VD = dyn_cast<VarDecl>(
this))
269 return VD->getDescribedVarTemplate();
270 if (
auto *AD = dyn_cast<TypeAliasDecl>(
this))
271 return AD->getDescribedAliasTemplate();
278 return TD->getTemplateParameters();
279 if (
auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(
this))
280 return CTPSD->getTemplateParameters();
281 if (
auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(
this))
282 return VTPSD->getTemplateParameters();
290 if (
auto *AsDC = dyn_cast<DeclContext>(
this))
291 return AsDC->isDependentContext();
299 if (
auto *DC = dyn_cast<DeclContext>(
this))
300 if (DC->isFileContext())
304 return TPL->getDepth() + 1;
309 auto *RD = dyn_cast<CXXRecordDecl>(
this);
310 if (RD && RD->isDependentLambda())
311 if (
Decl *Context = RD->getLambdaContextDecl())
312 return Context->getTemplateDepth();
316 return cast<Decl>(DC)->getTemplateDepth();
323 if (DC->isFunctionOrMethod())
339 TheLoc.
print(OS, SM);
345 if (
const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
347 DN->printQualifiedName(OS);
371 getMultipleDC()->LexicalDC = DC;
385 "hidden declaration has no owning module");
390 if (SemaDC == LexicalDC) {
393 auto *MDC =
new (Ctx) Decl::MultipleDC();
394 MDC->SemanticDC = SemaDC;
395 MDC->LexicalDC = LexicalDC;
407 if (!isa<TagDecl>(LDC))
409 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
419 if (
const auto *ND = dyn_cast<NamespaceDecl>(DC))
420 if (ND->isAnonymousNamespace())
433 const auto *DC = dyn_cast<DeclContext>(
this);
434 return DC && DC->isFileContext();
440 bool IgnoreTemplateOrMacroSubstitution) {
447 llvm::APInt Size = CAT->getSize();
448 if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
455 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete && Size.uge(1))
458 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete && Size.uge(2))
464 if (
const auto *OID = dyn_cast_if_present<ObjCIvarDecl>(
D))
465 return OID->getNextIvar() ==
nullptr;
467 const auto *FD = dyn_cast_if_present<FieldDecl>(
D);
474 llvm::APInt Size = CAT->getSize();
475 if (FD->getParent()->isUnion() && (Size.isZero() || Size.isOne()))
481 if (IgnoreTemplateOrMacroSubstitution) {
488 TInfo = TTL.getDecl()->getTypeSourceInfo();
493 if (
const Expr *SizeExpr =
494 dyn_cast_if_present<IntegerLiteral>(CTL.getSizeExpr());
506 return ++FI == FD->getParent()->field_end();
510 if (
auto *TUD = dyn_cast<TranslationUnitDecl>(
this))
514 assert(DC &&
"This decl is not contained in a translation unit!");
518 assert(DC &&
"This decl is not contained in a translation unit!");
521 return cast<TranslationUnitDecl>(DC);
546 for (; I !=
E; ++I) {
547 if (!I->isAlignmentErrorDependent())
548 Align = std::max(Align, I->getAlignment(Ctx));
572 if (
C.getASTMutationListener())
573 C.getASTMutationListener()->DeclarationMarkedUsed(
this);
583 for (
const auto *I :
redecls())
592 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
this)) {
594 }
else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(
this)) {
596 }
else if (
auto *TD = dyn_cast<TagDecl>(
this)) {
605 return dcd->getAttr<ExternalSourceSymbolAttr>();
612 return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>() ||
613 hasAttr<LoaderUninitializedAttr>();
617 if (
auto *AA = getAttr<AliasAttr>())
619 if (
auto *IFA = getAttr<IFuncAttr>())
621 if (
auto *NZA = getAttr<LoaderUninitializedAttr>())
630 StringRef RealizedPlatform = A->getPlatform()->getName();
632 return RealizedPlatform;
633 size_t suffix = RealizedPlatform.rfind(
"_app_extension");
634 if (suffix != StringRef::npos)
635 return RealizedPlatform.slice(0, suffix);
636 return RealizedPlatform;
649 const AvailabilityAttr *A,
650 std::string *Message,
651 VersionTuple EnclosingVersion) {
652 if (EnclosingVersion.empty())
655 if (EnclosingVersion.empty())
658 StringRef ActualPlatform = A->getPlatform()->getName();
665 StringRef PrettyPlatformName
666 = AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
668 if (PrettyPlatformName.empty())
669 PrettyPlatformName = ActualPlatform;
671 std::string HintMessage;
672 if (!A->getMessage().empty()) {
674 HintMessage += A->getMessage();
678 if (A->getUnavailable()) {
681 llvm::raw_string_ostream Out(*Message);
682 Out <<
"not available on " << PrettyPlatformName
690 if (!A->getIntroduced().empty() &&
691 EnclosingVersion < A->getIntroduced()) {
694 StringRef TargetEnv = Triple.getEnvironmentName();
696 llvm::Triple::getEnvironmentTypeName(Triple.getEnvironment());
698 if (!IIEnv || (Triple.hasEnvironment() && IIEnv->
getName() == TargetEnv)) {
701 llvm::raw_string_ostream Out(*Message);
702 VersionTuple VTI(A->getIntroduced());
703 Out <<
"introduced in " << PrettyPlatformName <<
" " << VTI;
704 if (Triple.hasEnvironment())
705 Out <<
" " << EnvName;
713 llvm::raw_string_ostream Out(*Message);
714 Out <<
"not available on " << PrettyPlatformName;
715 if (Triple.hasEnvironment())
716 Out <<
" " << EnvName;
725 if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
728 llvm::raw_string_ostream Out(*Message);
729 VersionTuple VTO(A->getObsoleted());
730 Out <<
"obsoleted in " << PrettyPlatformName <<
' '
731 << VTO << HintMessage;
738 if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
741 llvm::raw_string_ostream Out(*Message);
742 VersionTuple VTD(A->getDeprecated());
743 Out <<
"first deprecated in " << PrettyPlatformName <<
' '
744 << VTD << HintMessage;
754 VersionTuple EnclosingVersion,
755 StringRef *RealizedPlatform)
const {
756 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
757 return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
761 std::string ResultMessage;
763 for (
const auto *A :
attrs()) {
764 if (
const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
769 ResultMessage = std::string(Deprecated->getMessage());
775 if (
const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
777 *Message = std::string(Unavailable->getMessage());
781 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
783 Message, EnclosingVersion);
786 if (RealizedPlatform)
787 *RealizedPlatform = Availability->getPlatform()->getName();
794 ResultMessage.swap(*Message);
801 Message->swap(ResultMessage);
808 for (
const auto *A :
attrs()) {
809 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
812 if (!Availability->getIntroduced().empty())
813 return Availability->getIntroduced();
820 IsDefinition =
false;
823 if (
const auto *Var = dyn_cast<VarDecl>(
this)) {
824 if (Var->isThisDeclarationADefinition()) {
831 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
840 if (isa<ObjCInterfaceDecl>(
this) &&
854 if (isa<WeakImportAttr>(A))
857 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
870 case CXXDeductionGuide:
873 case ConstructorUsingShadow:
884 case HLSLRootSignature:
890 case NonTypeTemplateParm:
897 case ObjCCompatibleAlias:
903 case TemplateTypeParm:
907 case UnresolvedUsingTypename:
913 case UnresolvedUsingValue:
926 case ObjCAtDefsField:
943 case TemplateTemplateParm:
947 case UnresolvedUsingIfExists:
950 case OMPDeclareReduction:
953 case OMPDeclareMapper:
965 case ObjCPropertyImpl:
967 case PragmaDetectMismatch:
970 case OutlinedFunction:
971 case TranslationUnit:
975 case UnnamedGlobalConstant:
976 case TemplateParamObject:
980 case ClassTemplateSpecialization:
981 case ClassTemplatePartialSpecialization:
982 case VarTemplateSpecialization:
983 case VarTemplatePartialSpecialization:
984 case ObjCImplementation:
986 case ObjCCategoryImpl:
988 case OMPThreadPrivate:
991 case OMPCapturedExpr:
993 case LifetimeExtendedTemporary:
994 case RequiresExprBody:
995 case ImplicitConceptSpecialization:
1002 llvm_unreachable(
"Invalid DeclKind!");
1006 assert(!HasAttrs &&
"Decl already contains attrs.");
1009 assert(AttrBlank.empty() &&
"HasAttrs was wrong?");
1016 if (!HasAttrs)
return;
1037 auto I = Attrs.begin(),
E = Attrs.end();
1038 for (; I !=
E; ++I) {
1039 if (!(*I)->isInherited())
1046 assert(HasAttrs &&
"No attrs to get!");
1053#define DECL(NAME, BASE)
1054#define DECL_CONTEXT(NAME) \
1056 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
1057#include "clang/AST/DeclNodes.inc"
1059 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1066#define DECL(NAME, BASE)
1067#define DECL_CONTEXT(NAME) \
1069 return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
1070#include "clang/AST/DeclNodes.inc"
1072 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1079 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
1082 return Definition->getSourceRange().getEnd();
1087 return Body->getSourceRange().getEnd();
1092bool Decl::AccessDeclContextCheck()
const {
1103 if (isa<TranslationUnitDecl>(
this) || isa<TemplateTypeParmDecl>(
this) ||
1106 isa<StaticAssertDecl>(
this) || isa<BlockDecl>(
this) ||
1109 isa<ParmVarDecl>(
this) ||
1112 isa<CXXRecordDecl>(
this) || isa<LifetimeExtendedTemporaryDecl>(
this))
1116 "Access specifier is AS_none inside a record decl");
1124 while (DC && !isa<ExportDecl>(DC))
1127 return isa_and_nonnull<ExportDecl>(DC);
1131 if (isa<NamespaceDecl, TranslationUnitDecl>(
this))
1134 return M && M->isNamedModule() &&
1152 M = M->getTopLevelModule();
1153 if (!M->isNamedModule())
1162 if (!M || !M->isNamedModule())
1201 if (
const auto *
D = dyn_cast<ValueDecl>(
this))
1203 else if (
const auto *
D = dyn_cast<TypedefNameDecl>(
this))
1204 Ty =
D->getUnderlyingType();
1211 assert(isa<BindingDecl>(
this));
1229 if (
const auto *
D = dyn_cast<ValueDecl>(
this))
1231 else if (
const auto *
D = dyn_cast<TypedefNameDecl>(
this))
1232 Ty =
D->getUnderlyingType();
1247 if (
getKind(
D) == Decl::CXXMethod) {
1248 auto *MD = cast<CXXMethodDecl>(
D);
1249 if (MD->getOverloadedOperator() == OO_Call &&
1250 MD->getParent()->isLambda())
1254 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1256 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
1258 if (
auto *BD = dyn_cast<BlockDecl>(
D))
1260 if (
auto *CD = dyn_cast<CapturedDecl>(
D))
1262 if (
auto *OFD = dyn_cast<OutlinedFunctionDecl>(
D))
1268 return ::getNonClosureContext(
this);
1272 return ::getNonClosureContext(
this);
1283 setNeedToReconcileExternalVisibleStorage(
false);
1284 setHasLazyLocalLexicalLookups(
false);
1285 setHasLazyExternalLexicalLookups(
false);
1292#define DECL(NAME, BASE)
1293#define DECL_CONTEXT(NAME) case Decl::NAME:
1294#include "clang/AST/DeclNodes.inc"
1311 if (isa<FunctionDecl>(
this))
1329 if (Ctx->isClosure())
1330 return cast<BlockDecl>(Ctx);
1331 Ctx = Ctx->getParent();
1339 cast<NamespaceDecl>(
this)->isInline();
1346 const auto *ND = cast<NamespaceDecl>(
this);
1347 if (ND->isInline()) {
1348 return ND->getParent()->isStdNamespace();
1355 return II && II->
isStr(
"std");
1362 if (isa<ClassTemplatePartialSpecializationDecl>(
this))
1365 if (
const auto *
Record = dyn_cast<CXXRecordDecl>(
this)) {
1366 if (
Record->getDescribedClassTemplate())
1369 if (
Record->isDependentLambda())
1371 if (
Record->isNeverDependentLambda())
1375 if (
const auto *
Function = dyn_cast<FunctionDecl>(
this)) {
1376 if (
Function->getDescribedFunctionTemplate())
1381 if (cast<Decl>(
this)->getFriendObjectKind())
1394 return !cast<EnumDecl>(
this)->isScoped();
1396 return isa<LinkageSpecDecl, ExportDecl, HLSLBufferDecl>(
this);
1401 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1403 return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
1415 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1418 return cast<LinkageSpecDecl>(DC);
1433 if (!isa<LinkageSpecDecl, ExportDecl>(DC) &&
1444 if (!isa<LinkageSpecDecl, ExportDecl>(DC) &&
1454 assert(DC &&
"All transparent contexts should have a parent!");
1461 case Decl::ExternCContext:
1462 case Decl::LinkageSpec:
1464 case Decl::TopLevelStmt:
1466 case Decl::Captured:
1467 case Decl::OutlinedFunction:
1468 case Decl::OMPDeclareReduction:
1469 case Decl::OMPDeclareMapper:
1470 case Decl::RequiresExprBody:
1474 case Decl::HLSLBuffer:
1483 case Decl::TranslationUnit:
1485 case Decl::Namespace:
1488 case Decl::ObjCMethod:
1491 case Decl::ObjCInterface:
1492 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(
this))
1493 if (
auto *Def = OID->getDefinition())
1497 case Decl::ObjCProtocol:
1498 if (
auto *OPD = dyn_cast<ObjCProtocolDecl>(
this))
1499 if (
auto *Def = OPD->getDefinition())
1503 case Decl::ObjCCategory:
1506 case Decl::ObjCImplementation:
1507 case Decl::ObjCCategoryImpl:
1512 case Decl::ClassTemplatePartialSpecialization:
1513 case Decl::ClassTemplateSpecialization:
1514 case Decl::CXXRecord:
1515 return cast<CXXRecordDecl>(
this)->getDefinitionOrSelf();
1518 return cast<TagDecl>(
this)->getDefinitionOrSelf();
1522 getDeclKind() <= Decl::lastFunction &&
"Unknown DeclContext kind");
1527template <
typename T>
1531 Contexts.push_back(
D);
1533 std::reverse(Contexts.begin(), Contexts.end());
1541 if (Kind == Decl::TranslationUnit)
1543 else if (Kind == Decl::Namespace)
1546 Contexts.push_back(
this);
1549std::pair<Decl *, Decl *>
1551 bool FieldsAlreadyLoaded) {
1553 Decl *FirstNewDecl =
nullptr;
1554 Decl *PrevDecl =
nullptr;
1555 for (
auto *
D : Decls) {
1556 if (FieldsAlreadyLoaded && isa<FieldDecl>(
D))
1567 return std::make_pair(FirstNewDecl, PrevDecl);
1573void DeclContext::reconcileExternalVisibleStorage()
const {
1574 assert(hasNeedToReconcileExternalVisibleStorage() &&
LookupPtr);
1575 setNeedToReconcileExternalVisibleStorage(
false);
1578 Lookup.second.setHasExternalDecls();
1585DeclContext::LoadLexicalDeclsFromExternalStorage()
const {
1602 bool FieldsAlreadyLoaded =
false;
1603 if (
const auto *RD = dyn_cast<RecordDecl>(
this))
1604 FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1608 Decl *ExternalFirst, *ExternalLast;
1609 std::tie(ExternalFirst, ExternalLast) =
1624 Map = DC->CreateStoredDeclsMap(Context);
1625 if (DC->hasNeedToReconcileExternalVisibleStorage())
1626 DC->reconcileExternalVisibleStorage();
1628 (*Map)[Name].removeExternalDecls();
1640 Map = DC->CreateStoredDeclsMap(Context);
1641 if (DC->hasNeedToReconcileExternalVisibleStorage())
1642 DC->reconcileExternalVisibleStorage();
1645 List.replaceExternalDecls(Decls);
1646 return List.getLookupResult();
1651 LoadLexicalDeclsFromExternalStorage();
1657 LoadLexicalDeclsFromExternalStorage();
1669 LoadLexicalDeclsFromExternalStorage();
1677 if (!
D->getDeclName())
1696 if (isa<ClassTemplateSpecializationDecl>(
D))
1698 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1699 if (FD->isFunctionTemplateSpecialization())
1714 "decl being removed from non-lexical context");
1716 "decl is not in decls list");
1726 assert(I &&
"decl not found in linked list");
1727 if (I->NextInContextAndBits.getPointer() ==
D) {
1739 if (isa<NamedDecl>(
D)) {
1740 auto *ND = cast<NamedDecl>(
D);
1748 if (!ND->getDeclName())
1755 StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1756 assert(Pos != Map->end() &&
"no lookup entry for decl");
1763 }
while (DC->isTransparentContext() && (DC = DC->getParent()));
1769 "Decl inserted into wrong lexical context");
1771 "Decl already inserted into a DeclContext");
1782 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
this))
1788 if (
auto *Import = dyn_cast<ImportDecl>(
D))
1796 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1797 ND->getDeclContext()->getPrimaryContext()->
1798 makeDeclVisibleInContextWithFlags(ND,
false,
true);
1804 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1805 ND->getDeclContext()->getPrimaryContext()->
1806 makeDeclVisibleInContextWithFlags(ND,
true,
true);
1819 if (!hasLazyLocalLexicalLookups() &&
1820 !hasLazyExternalLexicalLookups())
1826 if (hasLazyExternalLexicalLookups()) {
1827 setHasLazyExternalLexicalLookups(
false);
1828 for (
auto *DC : Contexts) {
1829 if (DC->hasExternalLexicalStorage()) {
1830 bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1831 setHasLazyLocalLexicalLookups(
1832 hasLazyLocalLexicalLookups() | LoadedDecls );
1836 if (!hasLazyLocalLexicalLookups())
1840 for (
auto *DC : Contexts)
1844 setHasLazyLocalLexicalLookups(
false);
1862 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1864 (!ND->isFromASTFile() ||
1867 makeDeclVisibleInContextImpl(ND,
Internal);
1872 if (
auto *InnerCtx = dyn_cast<DeclContext>(
D))
1873 if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1874 buildLookupImpl(InnerCtx,
Internal);
1891 "lookupImpl should only be called with primary DC!");
1893 "We shouldn't lookup in transparent DC.");
1900 (void)cast<Decl>(
this)->getMostRecentDecl();
1903 assert(Source &&
"external visible storage but no external source?");
1905 if (hasNeedToReconcileExternalVisibleStorage())
1906 reconcileExternalVisibleStorage();
1910 if (hasLazyLocalLexicalLookups() ||
1911 hasLazyExternalLexicalLookups())
1919 std::pair<StoredDeclsMap::iterator, bool> R = Map->try_emplace(Name);
1920 if (!R.second && !R.first->second.hasExternalDecls())
1921 return R.first->second.getLookupResult();
1926 StoredDeclsMap::iterator I = Map->find(Name);
1927 if (I != Map->end())
1928 return I->second.getLookupResult();
1936 if (hasLazyLocalLexicalLookups() ||
1937 hasLazyExternalLexicalLookups())
1943 StoredDeclsMap::iterator I = Map->find(Name);
1944 if (I == Map->end())
1947 return I->second.getLookupResult();
1957 if (PrimaryContext !=
this)
1960 loadLazyLocalLexicalLookups();
1965 StoredDeclsMap::iterator I = Map->find(Name);
1966 return I != Map->end() ? I->second.getLookupResult()
1973void DeclContext::loadLazyLocalLexicalLookups() {
1974 if (hasLazyLocalLexicalLookups()) {
1977 for (
auto *Context : Contexts)
1979 setHasLazyLocalLexicalLookups(
false);
1991 llvm::append_range(Results, LookupResults);
1992 if (!Results.empty())
1998 if (Name && !hasLazyLocalLexicalLookups() &&
1999 !hasLazyExternalLexicalLookups()) {
2001 StoredDeclsMap::iterator Pos = Map->find(Name);
2002 if (Pos != Map->end()) {
2003 Results.insert(Results.end(),
2004 Pos->second.getLookupResult().begin(),
2005 Pos->second.getLookupResult().end());
2016 if (
auto *ND = dyn_cast<NamedDecl>(
D))
2017 if (ND->getDeclName() == Name)
2018 Results.push_back(ND);
2030 bool SkipRecords =
getDeclKind() == Decl::Kind::Enum &&
2035 while ((SkipRecords && Ctx->isRecord()) || Ctx->isTransparentContext())
2036 Ctx = Ctx->getParent();
2043 while (!Ctx->isFileContext())
2044 Ctx = Ctx->getParent();
2045 return Ctx->getPrimaryContext();
2053 OutermostRD = cast<RecordDecl>(DC);
2068 const auto *NS = dyn_cast<NamespaceDecl>(O);
2069 if (!NS || !NS->isInline())
2082 PrimaryDC->makeDeclVisibleInContextWithFlags(
D,
false, PrimaryDC == DeclDC);
2092 ->makeDeclVisibleInContextWithFlags(
D,
Internal, Recoverable);
2116 makeDeclVisibleInContextImpl(
D,
Internal);
2118 setHasLazyLocalLexicalLookups(
true);
2125 makeDeclVisibleInContextWithFlags(
D,
Internal, Recoverable);
2127 auto *DCAsDecl = cast<Decl>(
this);
2129 if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
2131 L->AddedVisibleDecl(
this,
D);
2139 Map = CreateStoredDeclsMap(*
C);
2169 return cast<UsingDirectiveDecl>(*I);
2186 assert(!
LookupPtr &&
"context already has a decls map");
2188 "creating decls map on non-primary context");
2196 M->Previous =
C.LastSDM;
2197 C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M,
Dependent);
2202void ASTContext::ReleaseDeclContextMaps() {
2207 LastSDM.setPointer(
nullptr);
2213 llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
2220 Map = Next.getPointer();
2228 assert(
Parent->isDependentContext()
2229 &&
"cannot iterate dependent diagnostics of non-dependent context");
2232 Parent->CreateStoredDeclsMap(
C);
2245 DD->NextDiagnostic = Map->FirstDiagnostic;
2246 Map->FirstDiagnostic = DD;
2252 return ID & llvm::maskTrailingOnes<DeclID>(32);
Defines the clang::ASTContext interface.
#define BuiltinTemplate(BTName)
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool shouldBeHidden(NamedDecl *D)
shouldBeHidden - Determine whether a declaration which was declared within its semantic context shoul...
static void collectAllContextsImpl(T *Self, SmallVectorImpl< DeclContext * > &Contexts)
static bool isLinkageSpecContext(const DeclContext *DC, LinkageSpecLanguageIDs ID)
static Decl::Kind getKind(const Decl *D)
static Decl * getNonClosureContext(T *D)
Starting at a given context (a Decl or DeclContext), look for a code context that is not a closure (a...
static AvailabilityResult CheckAvailability(ASTContext &Context, const AvailabilityAttr *A, std::string *Message, VersionTuple EnclosingVersion)
Determine the availability of the given declaration based on the target platform.
static StringRef getRealizedPlatform(const AvailabilityAttr *A, const ASTContext &Context)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenACC nodes for declarative directives.
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
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
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::SourceLocation class and associated facilities.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
const LangOptions & getLangOpts() const
llvm::BumpPtrAllocator & getAllocator() const
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
const TargetInfo & getTargetInfo() const
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Attr - This represents one attribute.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
The results of name lookup within a DeclContext.
decl_iterator - Iterates through the declarations stored within this context.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
udir_range using_directives() const
Returns iterator range [First, Last) of UsingDirectiveDecls stored within this context.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
static std::pair< Decl *, Decl * > BuildDeclChain(ArrayRef< Decl * > Decls, bool FieldsAlreadyLoaded)
Build up a chain of declarations.
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
ASTContext & getParentASTContext() const
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isLookupContext() const
Test whether the context supports looking up names.
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
const char * getDeclKindName() const
bool isTranslationUnit() const
void collectAllContexts(SmallVectorImpl< DeclContext * > &Contexts)
Collects all of the declaration contexts that are semantically connected to this declaration context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
llvm::iterator_range< udir_iterator > udir_range
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
DeclContext(Decl::Kind K)
void addDeclInternal(Decl *D)
Add the declaration D into this context, but suppress searches for external declarations with the sam...
bool containsDeclAndLoad(Decl *D) const
Checks whether a declaration is in this context.
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
StoredDeclsMap * buildLookup()
Ensure the lookup structure is fully-built and return it.
bool hasValidDeclKind() const
bool isStdNamespace() const
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
static bool classof(const Decl *D)
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
void setUseQualifiedLookup(bool use=true) const
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
friend class DependentDiagnostic
For CreateStoredDeclsMap.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
bool isInlineNamespace() const
DeclContextBitfields DeclContextBits
bool isFunctionOrMethod() const
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
StoredDeclsMap * LookupPtr
Pointer to the data structure used to lookup declarations within this context (or a DependentStoredDe...
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
void localUncachedLookup(DeclarationName Name, SmallVectorImpl< NamedDecl * > &Results)
A simplistic name lookup mechanism that performs name lookup into this declaration context without co...
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
decl_iterator decls_begin() const
bool LexicallyEncloses(const DeclContext *DC) const
Determine whether this declaration context lexically encloses the declaration context DC.
unsigned getLocalDeclIndex() const
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isInStdNamespace() const
bool isInCurrentModuleUnit() const
Whether this declaration comes from the same module unit being compiled.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
bool isTemplateDecl() const
returns true if this declaration is a template
Module * getTopLevelOwningNamedModule() const
Get the top level owning named module that owns this declaration if any.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isModuleLocal() const
Whether this declaration was a local declaration to a C++20 named module.
bool isFromGlobalModule() const
Whether this declaration comes from global module.
static bool isFlexibleArrayMemberLike(const ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setAttrs(const AttrVec &Attrs)
bool hasLocalOwningModuleStorage() const
bool isFunctionPointerType() const
bool isInNamedModule() const
Whether this declaration comes from a named module.
ExternalSourceSymbolAttr * getExternalSourceSymbolAttr() const
Looks on this and related declarations for an applicable external source symbol attribute.
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
bool isParameterPack() const
Whether this declaration is a parameter pack.
ASTMutationListener * getASTMutationListener() const
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
static unsigned getIdentifierNamespaceForKind(Kind DK)
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isFileContextDecl() const
static Decl * castFromDeclContext(const DeclContext *)
Decl * getNextDeclInContext()
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
SourceLocation getBodyRBrace() const
getBodyRBrace - Gets the right brace of the body, if a body exists.
bool isReferenced() const
Whether any declaration of this entity was referenced.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
llvm::PointerIntPair< Decl *, 3, ModuleOwnershipKind > NextInContextAndBits
The next declaration within the same lexical DeclContext.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool canBeWeakImported(bool &IsDefinition) const
Determines whether this symbol can be weak-imported, e.g., whether it would be well-formed to add the...
static DeclContext * castToDeclContext(const Decl *)
const TemplateParameterList * getDescribedTemplateParams() const
If this is a declaration that describes some template or partial specialization, this returns the cor...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
const Attr * getDefiningAttr() const
Return this declaration's defining attribute if it has one.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_OMPReduction
This declaration is an OpenMP user defined reduction construction.
@ IDNS_Label
Labels, declared with 'x:' and referenced with 'goto x'.
@ IDNS_Member
Members, declared with object declarations within tag definitions.
@ IDNS_OMPMapper
This declaration is an OpenMP user defined mapper.
@ IDNS_ObjCProtocol
Objective C @protocol.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_Using
This declaration is a using declaration.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setLocalOwningModule(Module *M)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
unsigned Access
Access - Used by C++ decls for the access specifier.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
bool isInAnonymousNamespace() const
static void EnableStatistics()
TranslationUnitDecl * getTranslationUnitDecl()
VersionTuple getVersionIntroduced() const
Retrieve the version of the target platform in which this declaration was introduced.
bool hasOwningModule() const
Is this declaration owned by some module?
bool isFromHeaderUnit() const
Whether this declaration comes from a header unit.
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
unsigned getOwningModuleID() const
Retrieve the global ID of the module that owns this particular declaration.
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
The name of a declaration.
A dependently-generated diagnostic.
static DependentDiagnostic * Create(ASTContext &Context, DeclContext *Parent, AccessNonce _, SourceLocation Loc, bool IsMemberAccess, AccessSpecifier AS, NamedDecl *TargetDecl, CXXRecordDecl *NamingClass, QualType BaseObjectType, const PartialDiagnostic &PDiag)
This represents one expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Abstract interface for external sources of AST nodes.
virtual ExtKind hasExternalDefinitions(const Decl *D)
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
static DeclContextLookupResult SetNoExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name)
virtual Module * getModule(unsigned ID)
Retrieve the module that corresponds to the given module ID.
virtual bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC)
Find all declarations with the given name in the given context, and add them to the context by callin...
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.
Represents a function declaration or definition.
FunctionType - C99 6.7.5.3 - Function Declarators.
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.
StrictFlexArraysLevelKind
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool trackLocalOwningModule() const
Do we need to track the owning module for a local declaration?
Represents a linkage specification.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
bool isExplicitGlobalModule() const
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
bool isHeaderUnit() const
Is this module a header unit.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
Represent a C++ namespace.
The basic abstraction for the target Objective-C runtime.
bool hasWeakClassImport() const
Does this runtime support weakly importing classes?
PointerType - C99 6.7.5.1 - Pointer Declarators.
void print(raw_ostream &OS) const override
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getCanonicalType() const
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
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.
An array of decls optimized for the common case of only containing one entry.
void setHasExternalDecls()
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)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
StringRef getPlatformName() const
Retrieve the name of the platform as it is used in the availability attribute.
VersionTuple getPlatformMinVersion() const
Retrieve the minimum desired version of the platform, to which the program should be compiled.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Stores a list of template parameters for a TemplateDecl and its derived classes.
The top declaration context.
ASTContext & getASTContext() const
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
bool isBlockPointerType() const
bool isFunctionReferenceType() const
bool isFunctionPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isMemberFunctionPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
Wrapper for source info for typedefs.
Represents C++ using-directive.
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
The JSON file list parser is used to communicate input to InstallAPI.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
@ FunctionTemplate
The name was classified as a function template name.
@ Concept
The name was classified as a concept name.
@ VarTemplate
The name was classified as a variable template name.
AvailabilityResult
Captures the result of checking the availability of a declaration.
const FunctionProtoType * T
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
UsingDirectiveDecl * operator*() const