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");
72 void *Start = Context.Allocate(Size +
Extra + 8);
73 void *
Result = (
char*)Start + 8;
75 uint64_t *PrefixPtr = (uint64_t *)
Result - 1;
77 *PrefixPtr = ID.getRawValue();
82 assert((*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48)) &&
83 "Current Implementation limits the number of module files to not "
84 "exceed 2^16. Contact Clang Developers to remove the limitation.");
89void *Decl::operator
new(std::size_t Size,
const ASTContext &Ctx,
91 assert(!Parent || &Parent->getParentASTContext() == &Ctx);
95 if (Ctx.getLangOpts().trackLocalOwningModule() || !Parent) {
99 llvm::offsetToAlignment(
sizeof(
Module *), llvm::Align(
alignof(
Decl)));
100 auto *Buffer =
reinterpret_cast<char *
>(
101 ::operator
new(ExtraAlign +
sizeof(
Module *) + Size +
Extra, Ctx));
102 Buffer += ExtraAlign;
104 Parent ?
cast<Decl>(Parent)->getOwningModule() :
nullptr;
105 return new (Buffer)
Module*(ParentModule) + 1;
107 return ::operator
new(Size +
Extra, Ctx);
114 uint64_t ID = *((
const uint64_t *)
this - 1);
115 return GlobalDeclID(ID & llvm::maskTrailingOnes<uint64_t>(48));
122 uint64_t ID = *((
const uint64_t *)
this - 1);
127 assert(
isFromASTFile() &&
"Only works on a deserialized declaration");
144 assert((ID < llvm::maskTrailingOnes<unsigned>(16)) &&
145 "Current Implementation limits the number of modules to not exceed "
146 "2^16. Contact Clang Developers to remove the limitation.");
147 uint64_t *IDAddress = (uint64_t *)
this - 1;
148 *IDAddress &= llvm::maskTrailingOnes<uint64_t>(48);
149 *IDAddress |= (uint64_t)ID << 48;
160Module *Decl::getOwningModuleSlow()
const {
171 default: llvm_unreachable(
"Declaration not in DeclNodes.inc!");
172#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
173#define ABSTRACT_DECL(DECL)
174#include "clang/AST/DeclNodes.inc"
194 if (
auto *DD = dyn_cast<DecompositionDecl>(
this)) {
195 for (
auto *Binding : DD->bindings()) {
196 Binding->setInvalidDecl();
203#define DECL(DERIVED, BASE) case Decl::DERIVED: return true;
204#define ABSTRACT_DECL(DECL)
205#include "clang/AST/DeclNodes.inc"
212#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
213#define ABSTRACT_DECL(DECL)
214#include "clang/AST/DeclNodes.inc"
216 llvm_unreachable(
"Declaration context not in DeclNodes.inc!");
219bool Decl::StatisticsEnabled =
false;
221 StatisticsEnabled =
true;
225 llvm::errs() <<
"\n*** Decl Stats:\n";
228#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
229#define ABSTRACT_DECL(DECL)
230#include "clang/AST/DeclNodes.inc"
231 llvm::errs() <<
" " << totalDecls <<
" decls total.\n";
234#define DECL(DERIVED, BASE) \
235 if (n##DERIVED##s > 0) { \
236 totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
237 llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
238 << sizeof(DERIVED##Decl) << " each (" \
239 << n##DERIVED##s * sizeof(DERIVED##Decl) \
242#define ABSTRACT_DECL(DECL)
243#include "clang/AST/DeclNodes.inc"
245 llvm::errs() <<
"Total bytes = " << totalBytes <<
"\n";
250#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
251#define ABSTRACT_DECL(DECL)
252#include "clang/AST/DeclNodes.inc"
257 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
this))
258 return TTP->isParameterPack();
259 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
this))
260 return NTTP->isParameterPack();
261 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
this))
262 return TTP->isParameterPack();
267 if (
const auto *Var = dyn_cast<ValueDecl>(
this))
268 return Var->isParameterPack();
274 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
276 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
277 return FTD->getTemplatedDecl();
286 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
287 return FD->getDescribedFunctionTemplate();
288 if (
auto *RD = dyn_cast<CXXRecordDecl>(
this))
289 return RD->getDescribedClassTemplate();
290 if (
auto *VD = dyn_cast<VarDecl>(
this))
291 return VD->getDescribedVarTemplate();
292 if (
auto *AD = dyn_cast<TypeAliasDecl>(
this))
293 return AD->getDescribedAliasTemplate();
300 return TD->getTemplateParameters();
301 if (
auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(
this))
302 return CTPSD->getTemplateParameters();
303 if (
auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(
this))
304 return VTPSD->getTemplateParameters();
312 if (
auto *AsDC = dyn_cast<DeclContext>(
this))
313 return AsDC->isDependentContext();
321 if (
auto *DC = dyn_cast<DeclContext>(
this))
322 if (DC->isFileContext())
326 return TPL->getDepth() + 1;
328 if (
auto *ESD = dyn_cast<CXXExpansionStmtDecl>(
this))
329 return ESD->getIndexTemplateParm()->getDepth() + 1;
334 auto *RD = dyn_cast<CXXRecordDecl>(
this);
335 if (RD && RD->isDependentLambda())
336 if (
Decl *Context = RD->getLambdaContextDecl())
337 return Context->getTemplateDepth();
348 if (DC->isFunctionOrMethod())
361 TheLoc = TheDecl->getLocation();
364 TheLoc.
print(OS, SM);
370 if (
const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
372 DN->printQualifiedName(OS);
396 getMultipleDC()->LexicalDC = DC;
411 "hidden declaration has no owning module");
416 if (SemaDC == LexicalDC) {
419 auto *MDC =
new (Ctx) Decl::MultipleDC();
420 MDC->SemanticDC = SemaDC;
421 MDC->LexicalDC = LexicalDC;
435 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
445 if (
const auto *ND = dyn_cast<NamespaceDecl>(DC))
446 if (ND->isAnonymousNamespace())
459 const auto *DC = dyn_cast<DeclContext>(
this);
460 return DC && DC->isFileContext();
466 bool IgnoreTemplateOrMacroSubstitution) {
473 llvm::APInt Size = CAT->getSize();
474 if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
481 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete && Size.uge(1))
484 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete && Size.uge(2))
490 if (
const auto *OID = dyn_cast_if_present<ObjCIvarDecl>(D))
491 return OID->getNextIvar() ==
nullptr;
493 const auto *FD = dyn_cast_if_present<FieldDecl>(D);
500 llvm::APInt Size = CAT->getSize();
501 if (FD->getParent()->isUnion() && (Size.isZero() || Size.isOne()))
507 if (IgnoreTemplateOrMacroSubstitution) {
514 TInfo = TTL.getDecl()->getTypeSourceInfo();
519 if (
const Expr *SizeExpr =
520 dyn_cast_if_present<IntegerLiteral>(CTL.getSizeExpr());
532 return ++FI == FD->getParent()->field_end();
536 if (
auto *TUD = dyn_cast<TranslationUnitDecl>(
this))
540 assert(DC &&
"This decl is not contained in a translation unit!");
544 assert(DC &&
"This decl is not contained in a translation unit!");
572 for (; I != E; ++I) {
573 if (!I->isAlignmentErrorDependent())
574 Align = std::max(Align, I->getAlignment(Ctx));
598 if (
C.getASTMutationListener())
599 C.getASTMutationListener()->DeclarationMarkedUsed(
this);
609 for (
const auto *I :
redecls())
618 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
this)) {
620 }
else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(
this)) {
622 }
else if (
auto *TD = dyn_cast<TagDecl>(
this)) {
631 return dcd->getAttr<ExternalSourceSymbolAttr>();
656 StringRef RealizedPlatform = A->getPlatform()->getName();
657 if (!Context.getLangOpts().AppExt)
658 return RealizedPlatform;
659 size_t suffix = RealizedPlatform.rfind(
"_app_extension");
660 if (suffix != StringRef::npos)
661 return RealizedPlatform.slice(0, suffix);
662 return RealizedPlatform;
675 const AvailabilityAttr *A,
676 std::string *Message,
677 VersionTuple EnclosingVersion) {
678 if (EnclosingVersion.empty())
679 EnclosingVersion = Context.getTargetInfo().getPlatformMinVersion();
681 if (EnclosingVersion.empty())
684 StringRef ActualPlatform = A->getPlatform()->getName();
685 StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
691 StringRef PrettyPlatformName
692 = AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
694 if (PrettyPlatformName.empty())
695 PrettyPlatformName = ActualPlatform;
697 std::string HintMessage;
698 if (!A->getMessage().empty()) {
700 HintMessage += A->getMessage();
704 if (A->getUnavailable()) {
707 llvm::raw_string_ostream Out(*Message);
708 Out <<
"not available on " << PrettyPlatformName
716 if (!A->getIntroduced().empty() &&
717 EnclosingVersion < A->getIntroduced()) {
719 auto &Triple = Context.getTargetInfo().getTriple();
720 StringRef TargetEnv = Triple.getEnvironmentName();
722 llvm::Triple::getEnvironmentTypeName(Triple.getEnvironment());
724 if (!IIEnv || (Triple.hasEnvironment() && IIEnv->
getName() == TargetEnv)) {
727 llvm::raw_string_ostream Out(*Message);
728 VersionTuple VTI(A->getIntroduced());
729 Out <<
"introduced in " << PrettyPlatformName <<
" " << VTI;
730 if (Triple.hasEnvironment())
731 Out <<
" " << EnvName;
739 llvm::raw_string_ostream Out(*Message);
740 Out <<
"not available on " << PrettyPlatformName;
741 if (Triple.hasEnvironment())
742 Out <<
" " << EnvName;
751 if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
754 llvm::raw_string_ostream Out(*Message);
755 VersionTuple VTO(A->getObsoleted());
756 Out <<
"obsoleted in " << PrettyPlatformName <<
' '
757 << VTO << HintMessage;
764 if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
767 llvm::raw_string_ostream Out(*Message);
768 VersionTuple VTD(A->getDeprecated());
769 Out <<
"first deprecated in " << PrettyPlatformName <<
' '
770 << VTD << HintMessage;
780 VersionTuple EnclosingVersion,
781 StringRef *RealizedPlatform)
const {
782 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
783 return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
787 std::string ResultMessage;
789 for (
const auto *A :
attrs()) {
790 if (
const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
795 ResultMessage = std::string(Deprecated->getMessage());
801 if (
const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
803 *Message = std::string(Unavailable->getMessage());
807 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
808 Availability = Availability->getEffectiveAttr();
810 Message, EnclosingVersion);
813 if (RealizedPlatform)
814 *RealizedPlatform = Availability->getPlatform()->getName();
821 ResultMessage.swap(*Message);
828 Message->swap(ResultMessage);
834 StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
835 for (
const auto *A :
attrs()) {
836 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
837 Availability = Availability->getEffectiveAttr();
839 if (!Availability->getIntroduced().empty())
840 return Availability->getIntroduced();
848 IsDefinition =
false;
851 if (
const auto *Var = dyn_cast<VarDecl>(
this)) {
852 if (Var->isThisDeclarationADefinition()) {
859 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
885 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
886 Availability = Availability->getEffectiveAttr();
899 case CXXDeductionGuide:
902 case ConstructorUsingShadow:
913 case HLSLRootSignature:
919 case NonTypeTemplateParm:
926 case ObjCCompatibleAlias:
932 case TemplateTypeParm:
936 case UnresolvedUsingTypename:
942 case UnresolvedUsingValue:
955 case ObjCAtDefsField:
972 case TemplateTemplateParm:
976 case UnresolvedUsingIfExists:
979 case OMPDeclareReduction:
982 case OMPDeclareMapper:
994 case ObjCPropertyImpl:
996 case PragmaDetectMismatch:
999 case OutlinedFunction:
1000 case TranslationUnit:
1001 case ExternCContext:
1004 case UnnamedGlobalConstant:
1005 case TemplateParamObject:
1007 case UsingDirective:
1009 case ClassTemplateSpecialization:
1010 case ClassTemplatePartialSpecialization:
1011 case VarTemplateSpecialization:
1012 case VarTemplatePartialSpecialization:
1013 case ObjCImplementation:
1015 case ObjCCategoryImpl:
1017 case OMPThreadPrivate:
1018 case OMPGroupPrivate:
1021 case OMPCapturedExpr:
1023 case LifetimeExtendedTemporary:
1024 case RequiresExprBody:
1025 case ImplicitConceptSpecialization:
1026 case OpenACCDeclare:
1027 case OpenACCRoutine:
1029 case CXXExpansionStmt:
1034 llvm_unreachable(
"Invalid DeclKind!");
1038 assert(!HasAttrs &&
"Decl already contains attrs.");
1041 assert(AttrBlank.empty() &&
"HasAttrs was wrong?");
1048 if (!HasAttrs)
return;
1069 auto I = Attrs.begin(), E = Attrs.end();
1070 for (; I != E; ++I) {
1071 if (!(*I)->isInherited())
1078 assert(HasAttrs &&
"No attrs to get!");
1085#define DECL(NAME, BASE)
1086#define DECL_CONTEXT(NAME) \
1088 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
1089#include "clang/AST/DeclNodes.inc"
1091 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1098#define DECL(NAME, BASE)
1099#define DECL_CONTEXT(NAME) \
1101 return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
1102#include "clang/AST/DeclNodes.inc"
1104 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1111 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
1114 return Definition->getSourceRange().getEnd();
1119 return Body->getSourceRange().getEnd();
1124bool Decl::AccessDeclContextCheck()
const {
1148 "Access specifier is AS_none inside a record decl");
1159 return isa_and_nonnull<ExportDecl>(DC);
1166 return M && M->isNamedModule() &&
1184 M = M->getTopLevelModule();
1185 if (!M->isNamedModule())
1194 if (!M || !M->isNamedModule())
1233 if (
const auto *D = dyn_cast<ValueDecl>(
this))
1235 else if (
const auto *D = dyn_cast<TypedefNameDecl>(
this))
1236 Ty = D->getUnderlyingType();
1261 if (
const auto *D = dyn_cast<ValueDecl>(
this))
1263 else if (
const auto *D = dyn_cast<TypedefNameDecl>(
this))
1264 Ty = D->getUnderlyingType();
1279 if (
getKind(D) == Decl::CXXMethod) {
1281 if (MD->getOverloadedOperator() == OO_Call &&
1282 MD->getParent()->isLambda())
1286 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1288 if (
auto *MD = dyn_cast<ObjCMethodDecl>(D))
1290 if (
auto *BD = dyn_cast<BlockDecl>(D))
1292 if (
auto *CD = dyn_cast<CapturedDecl>(D))
1294 if (
auto *OFD = dyn_cast<OutlinedFunctionDecl>(D))
1300 return ::getNonClosureContext(
this);
1304 return ::getNonClosureContext(
this);
1315 setNeedToReconcileExternalVisibleStorage(
false);
1316 setHasLazyLocalLexicalLookups(
false);
1317 setHasLazyExternalLexicalLookups(
false);
1323#define DECL(NAME, BASE)
1324#define DECL_CONTEXT(NAME) case Decl::NAME:
1325#include "clang/AST/DeclNodes.inc"
1378 if (ND->isInline()) {
1379 return ND->getParent()->isStdNamespace();
1386 return II && II->
isStr(
"std");
1396 if (
const auto *
Record = dyn_cast<CXXRecordDecl>(
this)) {
1397 if (
Record->getDescribedClassTemplate())
1400 if (
Record->isDependentLambda())
1402 if (
Record->isNeverDependentLambda())
1406 if (
const auto *
Function = dyn_cast<FunctionDecl>(
this)) {
1407 if (
Function->getDescribedFunctionTemplate())
1432 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1446 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1485 assert(DC &&
"All transparent contexts should have a parent!");
1492 case Decl::ExternCContext:
1493 case Decl::LinkageSpec:
1495 case Decl::TopLevelStmt:
1497 case Decl::Captured:
1498 case Decl::OutlinedFunction:
1499 case Decl::OMPDeclareReduction:
1500 case Decl::OMPDeclareMapper:
1501 case Decl::RequiresExprBody:
1502 case Decl::CXXExpansionStmt:
1506 case Decl::HLSLBuffer:
1515 case Decl::TranslationUnit:
1517 case Decl::Namespace:
1520 case Decl::ObjCMethod:
1523 case Decl::ObjCInterface:
1524 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(
this))
1525 if (
auto *Def = OID->getDefinition())
1529 case Decl::ObjCProtocol:
1530 if (
auto *OPD = dyn_cast<ObjCProtocolDecl>(
this))
1531 if (
auto *Def = OPD->getDefinition())
1535 case Decl::ObjCCategory:
1538 case Decl::ObjCImplementation:
1539 case Decl::ObjCCategoryImpl:
1544 case Decl::ClassTemplatePartialSpecialization:
1545 case Decl::ClassTemplateSpecialization:
1546 case Decl::CXXRecord:
1554 getDeclKind() <= Decl::lastFunction &&
"Unknown DeclContext kind");
1559template <
typename T>
1562 for (
T *D =
Self->getMostRecentDecl(); D; D = D->getPreviousDecl())
1563 Contexts.push_back(D);
1565 std::reverse(Contexts.begin(), Contexts.end());
1573 if (Kind == Decl::TranslationUnit)
1575 else if (Kind == Decl::Namespace)
1578 Contexts.push_back(
this);
1581std::pair<Decl *, Decl *>
1583 bool FieldsAlreadyLoaded) {
1585 Decl *FirstNewDecl =
nullptr;
1586 Decl *PrevDecl =
nullptr;
1587 for (
auto *D : Decls) {
1599 return std::make_pair(FirstNewDecl, PrevDecl);
1605void DeclContext::reconcileExternalVisibleStorage()
const {
1606 assert(hasNeedToReconcileExternalVisibleStorage() &&
LookupPtr);
1607 setNeedToReconcileExternalVisibleStorage(
false);
1610 Lookup.second.setHasExternalDecls();
1617DeclContext::LoadLexicalDeclsFromExternalStorage()
const {
1627 Source->FindExternalLexicalDecls(
this, Decls);
1634 bool FieldsAlreadyLoaded =
false;
1635 if (
const auto *RD = dyn_cast<RecordDecl>(
this))
1636 FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1640 Decl *ExternalFirst, *ExternalLast;
1641 std::tie(ExternalFirst, ExternalLast) =
1656 Map = DC->CreateStoredDeclsMap(Context);
1657 if (DC->hasNeedToReconcileExternalVisibleStorage())
1658 DC->reconcileExternalVisibleStorage();
1660 (*Map)[Name].removeExternalDecls();
1672 Map = DC->CreateStoredDeclsMap(Context);
1673 if (DC->hasNeedToReconcileExternalVisibleStorage())
1674 DC->reconcileExternalVisibleStorage();
1683 LoadLexicalDeclsFromExternalStorage();
1689 LoadLexicalDeclsFromExternalStorage();
1701 LoadLexicalDeclsFromExternalStorage();
1730 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1731 if (FD->isFunctionTemplateSpecialization())
1746 "decl being removed from non-lexical context");
1748 "decl is not in decls list");
1757 for (
Decl *I =
FirstDecl;
true; I = I->NextInContextAndBits.getPointer()) {
1758 assert(I &&
"decl not found in linked list");
1759 if (I->NextInContextAndBits.getPointer() == D) {
1780 if (!ND->getDeclName())
1787 StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1788 assert(Pos != Map->end() &&
"no lookup entry for decl");
1795 }
while (DC->isTransparentContext() && (DC = DC->getParent()));
1801 "Decl inserted into wrong lexical context");
1803 "Decl already inserted into a DeclContext");
1806 LastDecl->NextInContextAndBits.setPointer(D);
1814 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
this))
1820 if (
auto *Import = dyn_cast<ImportDecl>(D))
1828 if (
auto *ND = dyn_cast<NamedDecl>(D))
1829 ND->getDeclContext()->getPrimaryContext()->
1830 makeDeclVisibleInContextWithFlags(ND,
false,
true);
1836 if (
auto *ND = dyn_cast<NamedDecl>(D))
1837 ND->getDeclContext()->getPrimaryContext()->
1838 makeDeclVisibleInContextWithFlags(ND,
true,
true);
1851 if (!hasLazyLocalLexicalLookups() &&
1852 !hasLazyExternalLexicalLookups())
1858 if (hasLazyExternalLexicalLookups()) {
1859 setHasLazyExternalLexicalLookups(
false);
1860 for (
auto *DC : Contexts) {
1861 if (DC->hasExternalLexicalStorage()) {
1862 bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1863 setHasLazyLocalLexicalLookups(
1864 hasLazyLocalLexicalLookups() | LoadedDecls );
1868 if (!hasLazyLocalLexicalLookups())
1872 for (
auto *DC : Contexts)
1876 setHasLazyLocalLexicalLookups(
false);
1894 if (
auto *ND = dyn_cast<NamedDecl>(D))
1896 (!ND->isFromASTFile() ||
1899 makeDeclVisibleInContextImpl(ND,
Internal);
1904 if (
auto *InnerCtx = dyn_cast<DeclContext>(D))
1905 if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1906 buildLookupImpl(InnerCtx,
Internal);
1923 "lookupImpl should only be called with primary DC!");
1925 "We shouldn't lookup in transparent DC.");
1935 assert(Source &&
"external visible storage but no external source?");
1937 if (hasNeedToReconcileExternalVisibleStorage())
1938 reconcileExternalVisibleStorage();
1942 if (hasLazyLocalLexicalLookups() ||
1943 hasLazyExternalLexicalLookups())
1951 std::pair<StoredDeclsMap::iterator, bool> R = Map->try_emplace(Name);
1952 if (!R.second && !R.first->second.hasExternalDecls())
1953 return R.first->second.getLookupResult();
1955 if (Source->FindExternalVisibleDeclsByName(
this, Name, OriginalLookupDC) ||
1958 StoredDeclsMap::iterator I = Map->find(Name);
1959 if (I != Map->end())
1960 return I->second.getLookupResult();
1968 if (hasLazyLocalLexicalLookups() ||
1969 hasLazyExternalLexicalLookups())
1975 StoredDeclsMap::iterator I = Map->find(Name);
1976 if (I == Map->end())
1979 return I->second.getLookupResult();
1989 if (PrimaryContext !=
this)
1992 loadLazyLocalLexicalLookups();
1997 StoredDeclsMap::iterator I = Map->find(Name);
1998 return I != Map->end() ? I->second.getLookupResult()
2005void DeclContext::loadLazyLocalLexicalLookups() {
2006 if (hasLazyLocalLexicalLookups()) {
2009 for (
auto *Context : Contexts)
2011 setHasLazyLocalLexicalLookups(
false);
2023 llvm::append_range(Results, LookupResults);
2024 if (!Results.empty())
2030 if (Name && !hasLazyLocalLexicalLookups() &&
2031 !hasLazyExternalLexicalLookups()) {
2033 StoredDeclsMap::iterator Pos = Map->find(Name);
2034 if (Pos != Map->end()) {
2035 Results.insert(Results.end(),
2036 Pos->second.getLookupResult().begin(),
2037 Pos->second.getLookupResult().end());
2047 for (
Decl *D =
FirstDecl; D; D = D->getNextDeclInContext()) {
2048 if (
auto *ND = dyn_cast<NamedDecl>(D))
2049 if (ND->getDeclName() == Name)
2050 Results.push_back(ND);
2062 bool SkipRecords =
getDeclKind() == Decl::Kind::Enum &&
2115 const auto *NS = dyn_cast<NamespaceDecl>(O);
2116 if (!NS || !NS->isInline())
2129 PrimaryDC->makeDeclVisibleInContextWithFlags(D,
false, PrimaryDC == DeclDC);
2139 ->makeDeclVisibleInContextWithFlags(D,
Internal, Recoverable);
2163 makeDeclVisibleInContextImpl(D,
Internal);
2165 setHasLazyLocalLexicalLookups(
true);
2172 makeDeclVisibleInContextWithFlags(D,
Internal, Recoverable);
2177 if (ASTMutationListener *L = DCAsDecl->getASTMutationListener())
2178 L->AddedVisibleDecl(
this, D);
2186 Map = CreateStoredDeclsMap(*
C);
2200 StoredDeclsList &DeclNameEntries = (*Map)[D->
getDeclName()];
2233 assert(!
LookupPtr &&
"context already has a decls map");
2235 "creating decls map on non-primary context");
2243 M->Previous =
C.LastSDM;
2244 C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M,
Dependent);
2249void ASTContext::ReleaseDeclContextMaps() {
2254 LastSDM.setPointer(
nullptr);
2260 llvm::PointerIntPair<StoredDeclsMap*,1>
Next = Map->Previous;
2267 Map =
Next.getPointer();
2276 &&
"cannot iterate dependent diagnostics of non-dependent context");
2279 Parent->CreateStoredDeclsMap(
C);
2292 DD->NextDiagnostic = Map->FirstDiagnostic;
2293 Map->FirstDiagnostic = DD;
2299 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...
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.
decl_iterator - Iterates through the declarations stored within this context.
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...
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
friend class ExternalASTSource
For reconcileExternalVisibleStorage, CreateStoredDeclsMap, hasNeedToReconcileExternalVisibleStorage.
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
FunctionDecl * getEnclosingFunction()
Cast this to a FunctionDecl if it is one, ignoring any intervening expansion statements.
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
FunctionDecl * castEnclosingFunction()
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
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
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.
DeclContext * getEnclosingNonExpansionStatementContext()
Retrieve the innermost enclosing context that doesn't belong to an expansion statement.
unsigned getLocalDeclIndex() const
Decl - This represents one declaration (or definition), e.g.
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)
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.
@ VisiblePromoted
This declaration has an owning module, and is not visible to the current TU but we promoted it to be ...
@ 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...
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.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special 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.
specific_decl_iterator< FieldDecl > field_iterator
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.
void replaceExternalDecls(ArrayRef< NamedDecl * > Decls)
void remove(NamedDecl *D)
DeclContext::lookup_result getLookupResult() const
Return the list of all the decls.
static void DestroyAll(StoredDeclsMap *Map, bool Dependent)
The base class of all kinds of template declarations (e.g., class, function, etc.).
Stores a list of template parameters for a TemplateDecl and its derived classes.
The top declaration context.
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.
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
@ 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.
const FunctionProtoType * T
@ ExplicitInstantiation
We are parsing an explicit instantiation.
@ 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.
U cast(CodeGen::Address addr)
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
UsingDirectiveDecl * operator*() const