37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/PointerIntPair.h"
39#include "llvm/ADT/SmallVector.h"
40#include "llvm/ADT/StringRef.h"
41#include "llvm/Support/Casting.h"
42#include "llvm/Support/ErrorHandling.h"
43#include "llvm/Support/MathExtras.h"
44#include "llvm/Support/VersionTuple.h"
45#include "llvm/Support/raw_ostream.h"
59#define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
60#define ABSTRACT_DECL(DECL)
61#include "clang/AST/DeclNodes.inc"
67#define DECL(DERIVED, BASE) \
68 static_assert(alignof(Decl) >= alignof(DERIVED##Decl), \
69 "Alignment sufficient after objects prepended to " #DERIVED);
70#define ABSTRACT_DECL(DECL)
71#include "clang/AST/DeclNodes.inc"
73void *Decl::operator
new(std::size_t Size,
const ASTContext &Context,
77 static_assert(
sizeof(uint64_t) >=
alignof(
Decl),
"Decl won't be misaligned");
78 void *Start = Context.
Allocate(Size + Extra + 8);
79 void *
Result = (
char*)Start + 8;
81 uint64_t *PrefixPtr = (uint64_t *)
Result - 1;
83 *PrefixPtr = ID.getRawValue();
87 assert(*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48));
92void *Decl::operator
new(std::size_t Size,
const ASTContext &Ctx,
94 assert(!
Parent || &
Parent->getParentASTContext() == &Ctx);
98 if (Ctx.getLangOpts().trackLocalOwningModule() || !
Parent) {
102 llvm::offsetToAlignment(
sizeof(
Module *), llvm::Align(
alignof(
Decl)));
103 auto *Buffer =
reinterpret_cast<char *
>(
104 ::operator
new(ExtraAlign +
sizeof(
Module *) + Size + Extra, Ctx));
105 Buffer += ExtraAlign;
107 Parent ? cast<Decl>(
Parent)->getOwningModule() :
nullptr;
108 return new (Buffer)
Module*(ParentModule) + 1;
110 return ::operator
new(Size + Extra, Ctx);
117 uint64_t ID = *((
const uint64_t *)
this - 1);
118 return GlobalDeclID(ID & llvm::maskTrailingOnes<uint64_t>(48));
125 uint64_t ID = *((
const uint64_t *)
this - 1);
130 assert(
isFromASTFile() &&
"Only works on a deserialized declaration");
131 uint64_t *IDAddress = (uint64_t *)
this - 1;
132 *IDAddress &= llvm::maskTrailingOnes<uint64_t>(48);
133 *IDAddress |= (uint64_t)ID << 48;
136Module *Decl::getOwningModuleSlow()
const {
147 default: llvm_unreachable(
"Declaration not in DeclNodes.inc!");
148#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
149#define ABSTRACT_DECL(DECL)
150#include "clang/AST/DeclNodes.inc"
156 assert(!isa<TagDecl>(
this) || !cast<TagDecl>(
this)->isCompleteDefinition());
161 if (!isa<ParmVarDecl>(
this)) {
170 if (
auto *DD = dyn_cast<DecompositionDecl>(
this)) {
171 for (
auto *Binding : DD->bindings()) {
172 Binding->setInvalidDecl();
179#define DECL(DERIVED, BASE) case Decl::DERIVED: return true;
180#define ABSTRACT_DECL(DECL)
181#include "clang/AST/DeclNodes.inc"
188#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
189#define ABSTRACT_DECL(DECL)
190#include "clang/AST/DeclNodes.inc"
192 llvm_unreachable(
"Declaration context not in DeclNodes.inc!");
195bool Decl::StatisticsEnabled =
false;
197 StatisticsEnabled =
true;
201 llvm::errs() <<
"\n*** Decl Stats:\n";
204#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
205#define ABSTRACT_DECL(DECL)
206#include "clang/AST/DeclNodes.inc"
207 llvm::errs() <<
" " << totalDecls <<
" decls total.\n";
210#define DECL(DERIVED, BASE) \
211 if (n##DERIVED##s > 0) { \
212 totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
213 llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
214 << sizeof(DERIVED##Decl) << " each (" \
215 << n##DERIVED##s * sizeof(DERIVED##Decl) \
218#define ABSTRACT_DECL(DECL)
219#include "clang/AST/DeclNodes.inc"
221 llvm::errs() <<
"Total bytes = " << totalBytes <<
"\n";
226#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
227#define ABSTRACT_DECL(DECL)
228#include "clang/AST/DeclNodes.inc"
233 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
this))
234 return TTP->isParameterPack();
235 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
this))
236 return NTTP->isParameterPack();
237 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
this))
238 return TTP->isParameterPack();
243 if (
const auto *Var = dyn_cast<VarDecl>(
this))
244 return Var->isParameterPack();
250 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
252 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
253 return FTD->getTemplatedDecl();
258 return isa<TemplateDecl>(
this);
262 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
263 return FD->getDescribedFunctionTemplate();
264 if (
auto *RD = dyn_cast<CXXRecordDecl>(
this))
265 return RD->getDescribedClassTemplate();
266 if (
auto *VD = dyn_cast<VarDecl>(
this))
267 return VD->getDescribedVarTemplate();
268 if (
auto *AD = dyn_cast<TypeAliasDecl>(
this))
269 return AD->getDescribedAliasTemplate();
276 return TD->getTemplateParameters();
277 if (
auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(
this))
278 return CTPSD->getTemplateParameters();
279 if (
auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(
this))
280 return VTPSD->getTemplateParameters();
288 if (
auto *AsDC = dyn_cast<DeclContext>(
this))
289 return AsDC->isDependentContext();
297 if (
auto *DC = dyn_cast<DeclContext>(
this))
298 if (DC->isFileContext())
302 return TPL->getDepth() + 1;
307 auto *RD = dyn_cast<CXXRecordDecl>(
this);
308 if (RD && RD->isDependentLambda())
309 if (
Decl *Context = RD->getLambdaContextDecl())
310 return Context->getTemplateDepth();
314 return cast<Decl>(DC)->getTemplateDepth();
321 if (DC->isFunctionOrMethod())
337 TheLoc.
print(OS, SM);
343 if (
const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
345 DN->printQualifiedName(OS);
369 getMultipleDC()->LexicalDC = DC;
383 "hidden declaration has no owning module");
388 if (SemaDC == LexicalDC) {
391 auto *MDC =
new (Ctx) Decl::MultipleDC();
392 MDC->SemanticDC = SemaDC;
393 MDC->LexicalDC = LexicalDC;
405 if (!isa<TagDecl>(LDC))
407 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
417 if (
const auto *ND = dyn_cast<NamespaceDecl>(DC))
418 if (ND->isAnonymousNamespace())
431 const auto *DC = dyn_cast<DeclContext>(
this);
432 return DC && DC->isFileContext();
438 bool IgnoreTemplateOrMacroSubstitution) {
445 llvm::APInt Size = CAT->getSize();
446 if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
453 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete && Size.uge(1))
456 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete && Size.uge(2))
462 if (
const auto *OID = dyn_cast_if_present<ObjCIvarDecl>(
D))
463 return OID->getNextIvar() ==
nullptr;
465 const auto *FD = dyn_cast_if_present<FieldDecl>(
D);
472 llvm::APInt Size = CAT->getSize();
473 if (FD->getParent()->isUnion() && (Size.isZero() || Size.isOne()))
479 if (IgnoreTemplateOrMacroSubstitution) {
492 if (
const Expr *SizeExpr =
493 dyn_cast_if_present<IntegerLiteral>(CTL.getSizeExpr());
505 return ++FI == FD->getParent()->field_end();
509 if (
auto *TUD = dyn_cast<TranslationUnitDecl>(
this))
513 assert(DC &&
"This decl is not contained in a translation unit!");
517 assert(DC &&
"This decl is not contained in a translation unit!");
520 return cast<TranslationUnitDecl>(DC);
545 for (; I !=
E; ++I) {
546 if (!I->isAlignmentErrorDependent())
547 Align = std::max(Align, I->getAlignment(Ctx));
571 if (
C.getASTMutationListener())
572 C.getASTMutationListener()->DeclarationMarkedUsed(
this);
582 for (
const auto *I :
redecls())
591 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
this)) {
593 }
else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(
this)) {
595 }
else if (
auto *TD = dyn_cast<TagDecl>(
this)) {
604 return dcd->getAttr<ExternalSourceSymbolAttr>();
611 return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>() ||
612 hasAttr<LoaderUninitializedAttr>();
616 if (
auto *AA = getAttr<AliasAttr>())
618 if (
auto *IFA = getAttr<IFuncAttr>())
620 if (
auto *NZA = getAttr<LoaderUninitializedAttr>())
629 StringRef RealizedPlatform = A->getPlatform()->getName();
631 return RealizedPlatform;
632 size_t suffix = RealizedPlatform.rfind(
"_app_extension");
633 if (suffix != StringRef::npos)
634 return RealizedPlatform.slice(0, suffix);
635 return RealizedPlatform;
648 const AvailabilityAttr *A,
649 std::string *Message,
650 VersionTuple EnclosingVersion) {
651 if (EnclosingVersion.empty())
654 if (EnclosingVersion.empty())
657 StringRef ActualPlatform = A->getPlatform()->getName();
664 StringRef PrettyPlatformName
665 = AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
667 if (PrettyPlatformName.empty())
668 PrettyPlatformName = ActualPlatform;
670 std::string HintMessage;
671 if (!A->getMessage().empty()) {
673 HintMessage += A->getMessage();
677 if (A->getUnavailable()) {
680 llvm::raw_string_ostream Out(*Message);
681 Out <<
"not available on " << PrettyPlatformName
689 if (!A->getIntroduced().empty() &&
690 EnclosingVersion < A->getIntroduced()) {
692 StringRef TargetEnv =
694 StringRef EnvName = llvm::Triple::getEnvironmentTypeName(
697 if (!IIEnv || (!TargetEnv.empty() && IIEnv->
getName() == TargetEnv)) {
700 llvm::raw_string_ostream Out(*Message);
701 VersionTuple VTI(A->getIntroduced());
702 Out <<
"introduced in " << PrettyPlatformName <<
" " << VTI <<
" "
703 << EnvName << HintMessage;
710 llvm::raw_string_ostream Out(*Message);
711 Out <<
"not available on " << PrettyPlatformName <<
" " << EnvName
720 if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
723 llvm::raw_string_ostream Out(*Message);
724 VersionTuple VTO(A->getObsoleted());
725 Out <<
"obsoleted in " << PrettyPlatformName <<
' '
726 << VTO << HintMessage;
733 if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
736 llvm::raw_string_ostream Out(*Message);
737 VersionTuple VTD(A->getDeprecated());
738 Out <<
"first deprecated in " << PrettyPlatformName <<
' '
739 << VTD << HintMessage;
749 VersionTuple EnclosingVersion,
750 StringRef *RealizedPlatform)
const {
751 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
752 return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
756 std::string ResultMessage;
758 for (
const auto *A :
attrs()) {
759 if (
const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
764 ResultMessage = std::string(Deprecated->getMessage());
770 if (
const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
772 *Message = std::string(Unavailable->getMessage());
776 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
778 Message, EnclosingVersion);
781 if (RealizedPlatform)
782 *RealizedPlatform = Availability->getPlatform()->getName();
789 ResultMessage.swap(*Message);
796 Message->swap(ResultMessage);
803 for (
const auto *A :
attrs()) {
804 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
807 if (!Availability->getIntroduced().empty())
808 return Availability->getIntroduced();
815 IsDefinition =
false;
818 if (
const auto *Var = dyn_cast<VarDecl>(
this)) {
819 if (Var->isThisDeclarationADefinition()) {
826 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
835 if (isa<ObjCInterfaceDecl>(
this) &&
849 if (isa<WeakImportAttr>(A))
852 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
865 case CXXDeductionGuide:
868 case ConstructorUsingShadow:
886 case NonTypeTemplateParm:
893 case ObjCCompatibleAlias:
899 case TemplateTypeParm:
903 case UnresolvedUsingTypename:
909 case UnresolvedUsingValue:
921 case ObjCAtDefsField:
934 case FunctionTemplate:
938 case TemplateTemplateParm:
939 case TypeAliasTemplate:
942 case UnresolvedUsingIfExists:
945 case OMPDeclareReduction:
948 case OMPDeclareMapper:
960 case ObjCPropertyImpl:
962 case PragmaDetectMismatch:
965 case TranslationUnit:
969 case UnnamedGlobalConstant:
970 case TemplateParamObject:
973 case BuiltinTemplate:
974 case ClassTemplateSpecialization:
975 case ClassTemplatePartialSpecialization:
976 case VarTemplateSpecialization:
977 case VarTemplatePartialSpecialization:
978 case ObjCImplementation:
980 case ObjCCategoryImpl:
982 case OMPThreadPrivate:
985 case OMPCapturedExpr:
987 case LifetimeExtendedTemporary:
988 case RequiresExprBody:
989 case ImplicitConceptSpecialization:
994 llvm_unreachable(
"Invalid DeclKind!");
998 assert(!HasAttrs &&
"Decl already contains attrs.");
1001 assert(AttrBlank.empty() &&
"HasAttrs was wrong?");
1008 if (!HasAttrs)
return;
1029 auto I = Attrs.begin(),
E = Attrs.end();
1030 for (; I !=
E; ++I) {
1031 if (!(*I)->isInherited())
1038 assert(HasAttrs &&
"No attrs to get!");
1045#define DECL(NAME, BASE)
1046#define DECL_CONTEXT(NAME) \
1048 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
1049#include "clang/AST/DeclNodes.inc"
1051 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1058#define DECL(NAME, BASE)
1059#define DECL_CONTEXT(NAME) \
1061 return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
1062#include "clang/AST/DeclNodes.inc"
1064 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1071 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
1074 return Definition->getSourceRange().getEnd();
1079 return Body->getSourceRange().getEnd();
1084bool Decl::AccessDeclContextCheck()
const {
1095 if (isa<TranslationUnitDecl>(
this) || isa<TemplateTypeParmDecl>(
this) ||
1098 isa<StaticAssertDecl>(
this) || isa<BlockDecl>(
this) ||
1101 isa<ParmVarDecl>(
this) ||
1104 isa<CXXRecordDecl>(
this) || isa<LifetimeExtendedTemporaryDecl>(
this))
1108 "Access specifier is AS_none inside a record decl");
1116 while (DC && !isa<ExportDecl>(DC))
1119 return isa_and_nonnull<ExportDecl>(DC);
1128 M = M->getTopLevelModule();
1132 if (M->isHeaderLikeModule())
1137 if (M->isGlobalModule())
1140 assert(M->isNamedModule() &&
"New module kind?");
1161 if (isa<BindingDecl>(
this))
1163 else if (
const auto *
D = dyn_cast<ValueDecl>(
this))
1165 else if (
const auto *
D = dyn_cast<TypedefNameDecl>(
this))
1166 Ty =
D->getUnderlyingType();
1182 if (
const auto *
D = dyn_cast<ValueDecl>(
this))
1184 else if (
const auto *
D = dyn_cast<TypedefNameDecl>(
this))
1185 Ty =
D->getUnderlyingType();
1200 if (
getKind(
D) == Decl::CXXMethod) {
1201 auto *MD = cast<CXXMethodDecl>(
D);
1202 if (MD->getOverloadedOperator() == OO_Call &&
1203 MD->getParent()->isLambda())
1207 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1209 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
1211 if (
auto *BD = dyn_cast<BlockDecl>(
D))
1213 if (
auto *CD = dyn_cast<CapturedDecl>(
D))
1219 return ::getNonClosureContext(
this);
1223 return ::getNonClosureContext(
this);
1234 setNeedToReconcileExternalVisibleStorage(
false);
1235 setHasLazyLocalLexicalLookups(
false);
1236 setHasLazyExternalLexicalLookups(
false);
1243#define DECL(NAME, BASE)
1244#define DECL_CONTEXT(NAME) case Decl::NAME:
1245#include "clang/AST/DeclNodes.inc"
1262 if (isa<FunctionDecl>(
this))
1281 return cast<BlockDecl>(Ctx);
1290 cast<NamespaceDecl>(
this)->isInline();
1297 const auto *ND = cast<NamespaceDecl>(
this);
1298 if (ND->isInline()) {
1299 return ND->getParent()->isStdNamespace();
1306 return II && II->
isStr(
"std");
1313 if (isa<ClassTemplatePartialSpecializationDecl>(
this))
1316 if (
const auto *
Record = dyn_cast<CXXRecordDecl>(
this)) {
1317 if (
Record->getDescribedClassTemplate())
1320 if (
Record->isDependentLambda())
1322 if (
Record->isNeverDependentLambda())
1326 if (
const auto *
Function = dyn_cast<FunctionDecl>(
this)) {
1327 if (
Function->getDescribedFunctionTemplate())
1332 if (cast<Decl>(
this)->getFriendObjectKind())
1345 return !cast<EnumDecl>(
this)->isScoped();
1347 return isa<LinkageSpecDecl, ExportDecl, HLSLBufferDecl>(
this);
1352 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1354 return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
1366 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1369 return cast<LinkageSpecDecl>(DC);
1384 if (!isa<LinkageSpecDecl>(DC) && !isa<ExportDecl>(DC) &&
1394 assert(DC &&
"All transparent contexts should have a parent!");
1401 case Decl::ExternCContext:
1402 case Decl::LinkageSpec:
1404 case Decl::TopLevelStmt:
1406 case Decl::Captured:
1407 case Decl::OMPDeclareReduction:
1408 case Decl::OMPDeclareMapper:
1409 case Decl::RequiresExprBody:
1413 case Decl::HLSLBuffer:
1422 case Decl::TranslationUnit:
1424 case Decl::Namespace:
1427 case Decl::ObjCMethod:
1430 case Decl::ObjCInterface:
1431 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(
this))
1432 if (
auto *Def = OID->getDefinition())
1436 case Decl::ObjCProtocol:
1437 if (
auto *OPD = dyn_cast<ObjCProtocolDecl>(
this))
1438 if (
auto *Def = OPD->getDefinition())
1442 case Decl::ObjCCategory:
1445 case Decl::ObjCImplementation:
1446 case Decl::ObjCCategoryImpl:
1453 auto *Tag = cast<TagDecl>(
this);
1455 if (
TagDecl *Def = Tag->getDefinition())
1458 if (
const auto *TagTy = dyn_cast<TagType>(Tag->getTypeForDecl())) {
1460 TagDecl *PossiblePartialDef = TagTy->getDecl();
1462 return PossiblePartialDef;
1464 assert(isa<InjectedClassNameType>(Tag->getTypeForDecl()));
1472 "Unknown DeclContext kind");
1477template <
typename T>
1480 Contexts.push_back(
D);
1482 std::reverse(Contexts.begin(), Contexts.end());
1490 if (Kind == Decl::TranslationUnit)
1492 else if (Kind == Decl::Namespace)
1495 Contexts.push_back(
this);
1498std::pair<Decl *, Decl *>
1500 bool FieldsAlreadyLoaded) {
1502 Decl *FirstNewDecl =
nullptr;
1503 Decl *PrevDecl =
nullptr;
1504 for (
auto *
D : Decls) {
1505 if (FieldsAlreadyLoaded && isa<FieldDecl>(
D))
1516 return std::make_pair(FirstNewDecl, PrevDecl);
1522void DeclContext::reconcileExternalVisibleStorage()
const {
1523 assert(hasNeedToReconcileExternalVisibleStorage() && LookupPtr);
1524 setNeedToReconcileExternalVisibleStorage(
false);
1526 for (
auto &Lookup : *LookupPtr)
1527 Lookup.second.setHasExternalDecls();
1534DeclContext::LoadLexicalDeclsFromExternalStorage()
const {
1551 bool FieldsAlreadyLoaded =
false;
1552 if (
const auto *RD = dyn_cast<RecordDecl>(
this))
1553 FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1557 Decl *ExternalFirst, *ExternalLast;
1558 std::tie(ExternalFirst, ExternalLast) =
1572 if (!(Map = DC->LookupPtr))
1573 Map = DC->CreateStoredDeclsMap(Context);
1574 if (DC->hasNeedToReconcileExternalVisibleStorage())
1575 DC->reconcileExternalVisibleStorage();
1577 (*Map)[Name].removeExternalDecls();
1588 if (!(Map = DC->LookupPtr))
1589 Map = DC->CreateStoredDeclsMap(Context);
1590 if (DC->hasNeedToReconcileExternalVisibleStorage())
1591 DC->reconcileExternalVisibleStorage();
1594 List.replaceExternalDecls(Decls);
1595 return List.getLookupResult();
1600 LoadLexicalDeclsFromExternalStorage();
1606 LoadLexicalDeclsFromExternalStorage();
1618 LoadLexicalDeclsFromExternalStorage();
1626 if (!
D->getDeclName())
1645 if (isa<ClassTemplateSpecializationDecl>(
D))
1647 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1648 if (FD->isFunctionTemplateSpecialization())
1663 "decl being removed from non-lexical context");
1665 "decl is not in decls list");
1675 assert(I &&
"decl not found in linked list");
1676 if (I->NextInContextAndBits.getPointer() ==
D) {
1688 if (isa<NamedDecl>(
D)) {
1689 auto *ND = cast<NamedDecl>(
D);
1697 if (!ND->getDeclName())
1704 StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1705 assert(Pos != Map->end() &&
"no lookup entry for decl");
1712 }
while (DC->isTransparentContext() && (DC = DC->getParent()));
1718 "Decl inserted into wrong lexical context");
1720 "Decl already inserted into a DeclContext");
1731 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
this))
1737 if (
auto *Import = dyn_cast<ImportDecl>(
D))
1745 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1746 ND->getDeclContext()->getPrimaryContext()->
1747 makeDeclVisibleInContextWithFlags(ND,
false,
true);
1753 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1754 ND->getDeclContext()->getPrimaryContext()->
1755 makeDeclVisibleInContextWithFlags(ND,
true,
true);
1768 if (!hasLazyLocalLexicalLookups() &&
1769 !hasLazyExternalLexicalLookups())
1775 if (hasLazyExternalLexicalLookups()) {
1776 setHasLazyExternalLexicalLookups(
false);
1777 for (
auto *DC : Contexts) {
1778 if (DC->hasExternalLexicalStorage()) {
1779 bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1780 setHasLazyLocalLexicalLookups(
1781 hasLazyLocalLexicalLookups() | LoadedDecls );
1785 if (!hasLazyLocalLexicalLookups())
1789 for (
auto *DC : Contexts)
1793 setHasLazyLocalLexicalLookups(
false);
1811 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1813 (!ND->isFromASTFile() ||
1816 makeDeclVisibleInContextImpl(ND,
Internal);
1821 if (
auto *InnerCtx = dyn_cast<DeclContext>(
D))
1822 if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1823 buildLookupImpl(InnerCtx,
Internal);
1834 if (PrimaryContext !=
this)
1835 return PrimaryContext->
lookup(Name);
1842 (void)cast<Decl>(
this)->getMostRecentDecl();
1845 assert(Source &&
"external visible storage but no external source?");
1847 if (hasNeedToReconcileExternalVisibleStorage())
1848 reconcileExternalVisibleStorage();
1852 if (hasLazyLocalLexicalLookups() ||
1853 hasLazyExternalLexicalLookups())
1861 std::pair<StoredDeclsMap::iterator, bool> R =
1863 if (!R.second && !R.first->second.hasExternalDecls())
1864 return R.first->second.getLookupResult();
1868 StoredDeclsMap::iterator I = Map->find(Name);
1869 if (I != Map->end())
1870 return I->second.getLookupResult();
1878 if (hasLazyLocalLexicalLookups() ||
1879 hasLazyExternalLexicalLookups())
1885 StoredDeclsMap::iterator I = Map->find(Name);
1886 if (I == Map->end())
1889 return I->second.getLookupResult();
1899 if (PrimaryContext !=
this)
1902 loadLazyLocalLexicalLookups();
1907 StoredDeclsMap::iterator I = Map->find(Name);
1908 return I != Map->end() ? I->second.getLookupResult()
1915void DeclContext::loadLazyLocalLexicalLookups() {
1916 if (hasLazyLocalLexicalLookups()) {
1919 for (
auto *Context : Contexts)
1921 setHasLazyLocalLexicalLookups(
false);
1933 Results.insert(Results.end(), LookupResults.
begin(), LookupResults.
end());
1934 if (!Results.empty())
1940 if (Name && !hasLazyLocalLexicalLookups() &&
1941 !hasLazyExternalLexicalLookups()) {
1943 StoredDeclsMap::iterator Pos = Map->find(Name);
1944 if (Pos != Map->end()) {
1945 Results.insert(Results.end(),
1946 Pos->second.getLookupResult().begin(),
1947 Pos->second.getLookupResult().end());
1958 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1959 if (ND->getDeclName() == Name)
1960 Results.push_back(ND);
1972 bool SkipRecords =
getDeclKind() == Decl::Kind::Enum &&
1995 OutermostRD = cast<RecordDecl>(DC);
2010 const auto *NS = dyn_cast<NamespaceDecl>(O);
2011 if (!NS || !NS->isInline())
2024 PrimaryDC->makeDeclVisibleInContextWithFlags(
D,
false, PrimaryDC == DeclDC);
2034 ->makeDeclVisibleInContextWithFlags(
D,
Internal, Recoverable);
2058 makeDeclVisibleInContextImpl(
D,
Internal);
2060 setHasLazyLocalLexicalLookups(
true);
2067 makeDeclVisibleInContextWithFlags(
D,
Internal, Recoverable);
2069 auto *DCAsDecl = cast<Decl>(
this);
2071 if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
2073 L->AddedVisibleDecl(
this,
D);
2081 Map = CreateStoredDeclsMap(*
C);
2091 Map->find(
D->getDeclName()) == Map->end())
2111 return cast<UsingDirectiveDecl>(*I);
2128 assert(!LookupPtr &&
"context already has a decls map");
2130 "creating decls map on non-primary context");
2138 M->Previous =
C.LastSDM;
2139 C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M,
Dependent);
2144void ASTContext::ReleaseDeclContextMaps() {
2149 LastSDM.setPointer(
nullptr);
2155 llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
2162 Map = Next.getPointer();
2170 assert(
Parent->isDependentContext()
2171 &&
"cannot iterate dependent diagnostics of non-dependent context");
2174 Parent->CreateStoredDeclsMap(
C);
2187 DD->NextDiagnostic = Map->FirstDiagnostic;
2188 Map->FirstDiagnostic = DD;
2194 return ID & llvm::maskTrailingOnes<DeclID>(32);
Defines the clang::ASTContext interface.
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 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.
void collectAllContextsImpl(T *Self, SmallVectorImpl< DeclContext * > &Contexts)
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 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.
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 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
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
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
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
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?
void updateOutOfDate(IdentifierInfo &II) const
Update a potentially out-of-date declaration.
static bool isFlexibleArrayMemberLike(ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
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.
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.
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.
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)
Find all declarations with the given name in the given context, and add them to the context by callin...
virtual void updateOutOfDateIdentifier(const IdentifierInfo &II)
Update an out-of-date identifier.
virtual void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Result)
Finds all declarations lexically contained within the given DeclContext, after applying an optional f...
Represents a member of a struct/union/class.
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.
Describes a module or submodule.
bool isExplicitGlobalModule() const
bool isNamedModule() const
Does this Module is a named module of a standard named 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.
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)
Represents the declaration of a struct/union/class/enum.
bool isBeingDefined() const
Return true if this decl is currently being defined.
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>.
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
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.
@ 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.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ 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.
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