37#include "llvm/ADT/PointerIntPair.h"
38#include "llvm/ADT/StringRef.h"
39#include "llvm/Support/ErrorHandling.h"
40#include "llvm/Support/MathExtras.h"
41#include "llvm/Support/VersionTuple.h"
42#include "llvm/Support/raw_ostream.h"
56#define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
57#define ABSTRACT_DECL(DECL)
58#include "clang/AST/DeclNodes.inc"
64#define DECL(DERIVED, BASE) \
65 static_assert(alignof(Decl) >= alignof(DERIVED##Decl), \
66 "Alignment sufficient after objects prepended to " #DERIVED);
67#define ABSTRACT_DECL(DECL)
68#include "clang/AST/DeclNodes.inc"
70void *Decl::operator
new(std::size_t Size,
const ASTContext &Context,
74 static_assert(
sizeof(uint64_t) >=
alignof(
Decl),
"Decl won't be misaligned");
75 void *Start = Context.
Allocate(Size + Extra + 8);
76 void *
Result = (
char*)Start + 8;
78 uint64_t *PrefixPtr = (uint64_t *)
Result - 1;
80 *PrefixPtr = ID.getRawValue();
84 assert(*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48));
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");
128 uint64_t *IDAddress = (uint64_t *)
this - 1;
129 *IDAddress &= llvm::maskTrailingOnes<uint64_t>(48);
130 *IDAddress |= (uint64_t)ID << 48;
133Module *Decl::getOwningModuleSlow()
const {
144 default: llvm_unreachable(
"Declaration not in DeclNodes.inc!");
145#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
146#define ABSTRACT_DECL(DECL)
147#include "clang/AST/DeclNodes.inc"
153 assert(!isa<TagDecl>(
this) || !cast<TagDecl>(
this)->isCompleteDefinition());
158 if (!isa<ParmVarDecl>(
this)) {
167 if (
auto *DD = dyn_cast<DecompositionDecl>(
this)) {
168 for (
auto *Binding : DD->bindings()) {
169 Binding->setInvalidDecl();
176#define DECL(DERIVED, BASE) case Decl::DERIVED: return true;
177#define ABSTRACT_DECL(DECL)
178#include "clang/AST/DeclNodes.inc"
185#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
186#define ABSTRACT_DECL(DECL)
187#include "clang/AST/DeclNodes.inc"
189 llvm_unreachable(
"Declaration context not in DeclNodes.inc!");
192bool Decl::StatisticsEnabled =
false;
194 StatisticsEnabled =
true;
198 llvm::errs() <<
"\n*** Decl Stats:\n";
201#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
202#define ABSTRACT_DECL(DECL)
203#include "clang/AST/DeclNodes.inc"
204 llvm::errs() <<
" " << totalDecls <<
" decls total.\n";
207#define DECL(DERIVED, BASE) \
208 if (n##DERIVED##s > 0) { \
209 totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
210 llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
211 << sizeof(DERIVED##Decl) << " each (" \
212 << n##DERIVED##s * sizeof(DERIVED##Decl) \
215#define ABSTRACT_DECL(DECL)
216#include "clang/AST/DeclNodes.inc"
218 llvm::errs() <<
"Total bytes = " << totalBytes <<
"\n";
223#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
224#define ABSTRACT_DECL(DECL)
225#include "clang/AST/DeclNodes.inc"
230 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
this))
231 return TTP->isParameterPack();
232 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
this))
233 return NTTP->isParameterPack();
234 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
this))
235 return TTP->isParameterPack();
240 if (
const auto *Var = dyn_cast<VarDecl>(
this))
241 return Var->isParameterPack();
247 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
249 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
250 return FTD->getTemplatedDecl();
255 return isa<TemplateDecl>(
this);
259 if (
auto *FD = dyn_cast<FunctionDecl>(
this))
260 return FD->getDescribedFunctionTemplate();
261 if (
auto *RD = dyn_cast<CXXRecordDecl>(
this))
262 return RD->getDescribedClassTemplate();
263 if (
auto *VD = dyn_cast<VarDecl>(
this))
264 return VD->getDescribedVarTemplate();
265 if (
auto *AD = dyn_cast<TypeAliasDecl>(
this))
266 return AD->getDescribedAliasTemplate();
273 return TD->getTemplateParameters();
274 if (
auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(
this))
275 return CTPSD->getTemplateParameters();
276 if (
auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(
this))
277 return VTPSD->getTemplateParameters();
285 if (
auto *AsDC = dyn_cast<DeclContext>(
this))
286 return AsDC->isDependentContext();
294 if (
auto *DC = dyn_cast<DeclContext>(
this))
295 if (DC->isFileContext())
299 return TPL->getDepth() + 1;
304 auto *RD = dyn_cast<CXXRecordDecl>(
this);
305 if (RD && RD->isDependentLambda())
306 if (
Decl *Context = RD->getLambdaContextDecl())
307 return Context->getTemplateDepth();
311 return cast<Decl>(DC)->getTemplateDepth();
318 if (DC->isFunctionOrMethod())
334 TheLoc.
print(OS, SM);
340 if (
const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
342 DN->printQualifiedName(OS);
366 getMultipleDC()->LexicalDC = DC;
380 "hidden declaration has no owning module");
385 if (SemaDC == LexicalDC) {
388 auto *MDC =
new (Ctx) Decl::MultipleDC();
389 MDC->SemanticDC = SemaDC;
390 MDC->LexicalDC = LexicalDC;
402 if (!isa<TagDecl>(LDC))
404 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
414 if (
const auto *ND = dyn_cast<NamespaceDecl>(DC))
415 if (ND->isAnonymousNamespace())
428 const auto *DC = dyn_cast<DeclContext>(
this);
429 return DC && DC->isFileContext();
435 bool IgnoreTemplateOrMacroSubstitution) {
442 llvm::APInt Size = CAT->getSize();
443 if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
450 if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete && Size.uge(1))
453 if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete && Size.uge(2))
459 if (
const auto *OID = dyn_cast_if_present<ObjCIvarDecl>(
D))
460 return OID->getNextIvar() ==
nullptr;
462 const auto *FD = dyn_cast_if_present<FieldDecl>(
D);
469 llvm::APInt Size = CAT->getSize();
470 if (FD->getParent()->isUnion() && (Size.isZero() || Size.isOne()))
476 if (IgnoreTemplateOrMacroSubstitution) {
489 if (
const Expr *SizeExpr =
490 dyn_cast_if_present<IntegerLiteral>(CTL.getSizeExpr());
502 return ++FI == FD->getParent()->field_end();
506 if (
auto *TUD = dyn_cast<TranslationUnitDecl>(
this))
510 assert(DC &&
"This decl is not contained in a translation unit!");
514 assert(DC &&
"This decl is not contained in a translation unit!");
517 return cast<TranslationUnitDecl>(DC);
542 for (; I !=
E; ++I) {
543 if (!I->isAlignmentErrorDependent())
544 Align = std::max(Align, I->getAlignment(Ctx));
568 if (
C.getASTMutationListener())
569 C.getASTMutationListener()->DeclarationMarkedUsed(
this);
579 for (
const auto *I :
redecls())
588 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
this)) {
590 }
else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(
this)) {
592 }
else if (
auto *TD = dyn_cast<TagDecl>(
this)) {
601 return dcd->getAttr<ExternalSourceSymbolAttr>();
608 return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>() ||
609 hasAttr<LoaderUninitializedAttr>();
613 if (
auto *AA = getAttr<AliasAttr>())
615 if (
auto *IFA = getAttr<IFuncAttr>())
617 if (
auto *NZA = getAttr<LoaderUninitializedAttr>())
626 StringRef RealizedPlatform = A->getPlatform()->getName();
628 return RealizedPlatform;
629 size_t suffix = RealizedPlatform.rfind(
"_app_extension");
630 if (suffix != StringRef::npos)
631 return RealizedPlatform.slice(0, suffix);
632 return RealizedPlatform;
645 const AvailabilityAttr *A,
646 std::string *Message,
647 VersionTuple EnclosingVersion) {
648 if (EnclosingVersion.empty())
651 if (EnclosingVersion.empty())
654 StringRef ActualPlatform = A->getPlatform()->getName();
661 StringRef PrettyPlatformName
662 = AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
664 if (PrettyPlatformName.empty())
665 PrettyPlatformName = ActualPlatform;
667 std::string HintMessage;
668 if (!A->getMessage().empty()) {
670 HintMessage += A->getMessage();
674 if (A->getUnavailable()) {
677 llvm::raw_string_ostream Out(*Message);
678 Out <<
"not available on " << PrettyPlatformName
686 if (!A->getIntroduced().empty() &&
687 EnclosingVersion < A->getIntroduced()) {
689 StringRef TargetEnv =
691 StringRef EnvName = llvm::Triple::getEnvironmentTypeName(
694 if (!IIEnv || (!TargetEnv.empty() && IIEnv->
getName() == TargetEnv)) {
697 llvm::raw_string_ostream Out(*Message);
698 VersionTuple VTI(A->getIntroduced());
699 Out <<
"introduced in " << PrettyPlatformName <<
" " << VTI <<
" "
700 << EnvName << HintMessage;
707 llvm::raw_string_ostream Out(*Message);
708 Out <<
"not available on " << PrettyPlatformName <<
" " << EnvName
717 if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
720 llvm::raw_string_ostream Out(*Message);
721 VersionTuple VTO(A->getObsoleted());
722 Out <<
"obsoleted in " << PrettyPlatformName <<
' '
723 << VTO << HintMessage;
730 if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
733 llvm::raw_string_ostream Out(*Message);
734 VersionTuple VTD(A->getDeprecated());
735 Out <<
"first deprecated in " << PrettyPlatformName <<
' '
736 << VTD << HintMessage;
746 VersionTuple EnclosingVersion,
747 StringRef *RealizedPlatform)
const {
748 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
this))
749 return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
753 std::string ResultMessage;
755 for (
const auto *A :
attrs()) {
756 if (
const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
761 ResultMessage = std::string(Deprecated->getMessage());
767 if (
const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
769 *Message = std::string(Unavailable->getMessage());
773 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
775 Message, EnclosingVersion);
778 if (RealizedPlatform)
779 *RealizedPlatform = Availability->getPlatform()->getName();
786 ResultMessage.swap(*Message);
793 Message->swap(ResultMessage);
800 for (
const auto *A :
attrs()) {
801 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
804 if (!Availability->getIntroduced().empty())
805 return Availability->getIntroduced();
812 IsDefinition =
false;
815 if (
const auto *Var = dyn_cast<VarDecl>(
this)) {
816 if (Var->isThisDeclarationADefinition()) {
823 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
832 if (isa<ObjCInterfaceDecl>(
this) &&
846 if (isa<WeakImportAttr>(A))
849 if (
const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
862 case CXXDeductionGuide:
865 case ConstructorUsingShadow:
881 case NonTypeTemplateParm:
888 case ObjCCompatibleAlias:
894 case TemplateTypeParm:
898 case UnresolvedUsingTypename:
904 case UnresolvedUsingValue:
917 case ObjCAtDefsField:
930 case FunctionTemplate:
934 case TemplateTemplateParm:
935 case TypeAliasTemplate:
938 case UnresolvedUsingIfExists:
941 case OMPDeclareReduction:
944 case OMPDeclareMapper:
956 case ObjCPropertyImpl:
958 case PragmaDetectMismatch:
961 case TranslationUnit:
965 case UnnamedGlobalConstant:
966 case TemplateParamObject:
969 case BuiltinTemplate:
970 case ClassTemplateSpecialization:
971 case ClassTemplatePartialSpecialization:
972 case VarTemplateSpecialization:
973 case VarTemplatePartialSpecialization:
974 case ObjCImplementation:
976 case ObjCCategoryImpl:
978 case OMPThreadPrivate:
981 case OMPCapturedExpr:
983 case LifetimeExtendedTemporary:
984 case RequiresExprBody:
985 case ImplicitConceptSpecialization:
990 llvm_unreachable(
"Invalid DeclKind!");
994 assert(!HasAttrs &&
"Decl already contains attrs.");
997 assert(AttrBlank.empty() &&
"HasAttrs was wrong?");
1004 if (!HasAttrs)
return;
1025 auto I = Attrs.begin(),
E = Attrs.end();
1026 for (; I !=
E; ++I) {
1027 if (!(*I)->isInherited())
1034 assert(HasAttrs &&
"No attrs to get!");
1041#define DECL(NAME, BASE)
1042#define DECL_CONTEXT(NAME) \
1044 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
1045#include "clang/AST/DeclNodes.inc"
1047 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1054#define DECL(NAME, BASE)
1055#define DECL_CONTEXT(NAME) \
1057 return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
1058#include "clang/AST/DeclNodes.inc"
1060 llvm_unreachable(
"a decl that inherits DeclContext isn't handled");
1067 if (
const auto *FD = dyn_cast<FunctionDecl>(
this)) {
1070 return Definition->getSourceRange().getEnd();
1075 return Body->getSourceRange().getEnd();
1080bool Decl::AccessDeclContextCheck()
const {
1091 if (isa<TranslationUnitDecl>(
this) || isa<TemplateTypeParmDecl>(
this) ||
1094 isa<StaticAssertDecl>(
this) || isa<BlockDecl>(
this) ||
1097 isa<ParmVarDecl>(
this) ||
1100 isa<CXXRecordDecl>(
this) || isa<LifetimeExtendedTemporaryDecl>(
this))
1104 "Access specifier is AS_none inside a record decl");
1112 while (DC && !isa<ExportDecl>(DC))
1115 return isa_and_nonnull<ExportDecl>(DC);
1132 M = M->getTopLevelModule();
1133 if (!M->isNamedModule())
1142 if (!M || !M->isNamedModule())
1181 if (
const auto *
D = dyn_cast<ValueDecl>(
this))
1183 else if (
const auto *
D = dyn_cast<TypedefNameDecl>(
this))
1184 Ty =
D->getUnderlyingType();
1191 assert(isa<BindingDecl>(
this));
1207 if (
const auto *
D = dyn_cast<ValueDecl>(
this))
1209 else if (
const auto *
D = dyn_cast<TypedefNameDecl>(
this))
1210 Ty =
D->getUnderlyingType();
1225 if (
getKind(
D) == Decl::CXXMethod) {
1226 auto *MD = cast<CXXMethodDecl>(
D);
1227 if (MD->getOverloadedOperator() == OO_Call &&
1228 MD->getParent()->isLambda())
1232 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1234 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
1236 if (
auto *BD = dyn_cast<BlockDecl>(
D))
1238 if (
auto *CD = dyn_cast<CapturedDecl>(
D))
1244 return ::getNonClosureContext(
this);
1248 return ::getNonClosureContext(
this);
1259 setNeedToReconcileExternalVisibleStorage(
false);
1260 setHasLazyLocalLexicalLookups(
false);
1261 setHasLazyExternalLexicalLookups(
false);
1268#define DECL(NAME, BASE)
1269#define DECL_CONTEXT(NAME) case Decl::NAME:
1270#include "clang/AST/DeclNodes.inc"
1287 if (isa<FunctionDecl>(
this))
1306 return cast<BlockDecl>(Ctx);
1315 cast<NamespaceDecl>(
this)->isInline();
1322 const auto *ND = cast<NamespaceDecl>(
this);
1323 if (ND->isInline()) {
1324 return ND->getParent()->isStdNamespace();
1331 return II && II->
isStr(
"std");
1338 if (isa<ClassTemplatePartialSpecializationDecl>(
this))
1341 if (
const auto *
Record = dyn_cast<CXXRecordDecl>(
this)) {
1342 if (
Record->getDescribedClassTemplate())
1345 if (
Record->isDependentLambda())
1347 if (
Record->isNeverDependentLambda())
1351 if (
const auto *
Function = dyn_cast<FunctionDecl>(
this)) {
1352 if (
Function->getDescribedFunctionTemplate())
1357 if (cast<Decl>(
this)->getFriendObjectKind())
1370 return !cast<EnumDecl>(
this)->isScoped();
1372 return isa<LinkageSpecDecl, ExportDecl, HLSLBufferDecl>(
this);
1377 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1379 return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
1391 while (DC->
getDeclKind() != Decl::TranslationUnit) {
1394 return cast<LinkageSpecDecl>(DC);
1409 if (!isa<LinkageSpecDecl>(DC) && !isa<ExportDecl>(DC) &&
1419 assert(DC &&
"All transparent contexts should have a parent!");
1426 case Decl::ExternCContext:
1427 case Decl::LinkageSpec:
1429 case Decl::TopLevelStmt:
1431 case Decl::Captured:
1432 case Decl::OMPDeclareReduction:
1433 case Decl::OMPDeclareMapper:
1434 case Decl::RequiresExprBody:
1438 case Decl::HLSLBuffer:
1447 case Decl::TranslationUnit:
1449 case Decl::Namespace:
1452 case Decl::ObjCMethod:
1455 case Decl::ObjCInterface:
1456 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(
this))
1457 if (
auto *Def = OID->getDefinition())
1461 case Decl::ObjCProtocol:
1462 if (
auto *OPD = dyn_cast<ObjCProtocolDecl>(
this))
1463 if (
auto *Def = OPD->getDefinition())
1467 case Decl::ObjCCategory:
1470 case Decl::ObjCImplementation:
1471 case Decl::ObjCCategoryImpl:
1478 auto *Tag = cast<TagDecl>(
this);
1480 if (
TagDecl *Def = Tag->getDefinition())
1483 if (
const auto *TagTy = dyn_cast<TagType>(Tag->getTypeForDecl())) {
1485 TagDecl *PossiblePartialDef = TagTy->getDecl();
1487 return PossiblePartialDef;
1489 assert(isa<InjectedClassNameType>(Tag->getTypeForDecl()));
1497 "Unknown DeclContext kind");
1502template <
typename T>
1506 Contexts.push_back(
D);
1508 std::reverse(Contexts.begin(), Contexts.end());
1516 if (Kind == Decl::TranslationUnit)
1518 else if (Kind == Decl::Namespace)
1521 Contexts.push_back(
this);
1524std::pair<Decl *, Decl *>
1526 bool FieldsAlreadyLoaded) {
1528 Decl *FirstNewDecl =
nullptr;
1529 Decl *PrevDecl =
nullptr;
1530 for (
auto *
D : Decls) {
1531 if (FieldsAlreadyLoaded && isa<FieldDecl>(
D))
1542 return std::make_pair(FirstNewDecl, PrevDecl);
1548void DeclContext::reconcileExternalVisibleStorage()
const {
1549 assert(hasNeedToReconcileExternalVisibleStorage() && LookupPtr);
1550 setNeedToReconcileExternalVisibleStorage(
false);
1552 for (
auto &Lookup : *LookupPtr)
1553 Lookup.second.setHasExternalDecls();
1560DeclContext::LoadLexicalDeclsFromExternalStorage()
const {
1577 bool FieldsAlreadyLoaded =
false;
1578 if (
const auto *RD = dyn_cast<RecordDecl>(
this))
1579 FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1583 Decl *ExternalFirst, *ExternalLast;
1584 std::tie(ExternalFirst, ExternalLast) =
1598 if (!(Map = DC->LookupPtr))
1599 Map = DC->CreateStoredDeclsMap(Context);
1600 if (DC->hasNeedToReconcileExternalVisibleStorage())
1601 DC->reconcileExternalVisibleStorage();
1603 (*Map)[Name].removeExternalDecls();
1614 if (!(Map = DC->LookupPtr))
1615 Map = DC->CreateStoredDeclsMap(Context);
1616 if (DC->hasNeedToReconcileExternalVisibleStorage())
1617 DC->reconcileExternalVisibleStorage();
1620 List.replaceExternalDecls(Decls);
1621 return List.getLookupResult();
1626 LoadLexicalDeclsFromExternalStorage();
1632 LoadLexicalDeclsFromExternalStorage();
1644 LoadLexicalDeclsFromExternalStorage();
1652 if (!
D->getDeclName())
1671 if (isa<ClassTemplateSpecializationDecl>(
D))
1673 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1674 if (FD->isFunctionTemplateSpecialization())
1689 "decl being removed from non-lexical context");
1691 "decl is not in decls list");
1701 assert(I &&
"decl not found in linked list");
1702 if (I->NextInContextAndBits.getPointer() ==
D) {
1714 if (isa<NamedDecl>(
D)) {
1715 auto *ND = cast<NamedDecl>(
D);
1723 if (!ND->getDeclName())
1730 StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1731 assert(Pos != Map->end() &&
"no lookup entry for decl");
1738 }
while (DC->isTransparentContext() && (DC = DC->getParent()));
1744 "Decl inserted into wrong lexical context");
1746 "Decl already inserted into a DeclContext");
1757 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
this))
1763 if (
auto *Import = dyn_cast<ImportDecl>(
D))
1771 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1772 ND->getDeclContext()->getPrimaryContext()->
1773 makeDeclVisibleInContextWithFlags(ND,
false,
true);
1779 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1780 ND->getDeclContext()->getPrimaryContext()->
1781 makeDeclVisibleInContextWithFlags(ND,
true,
true);
1794 if (!hasLazyLocalLexicalLookups() &&
1795 !hasLazyExternalLexicalLookups())
1801 if (hasLazyExternalLexicalLookups()) {
1802 setHasLazyExternalLexicalLookups(
false);
1803 for (
auto *DC : Contexts) {
1804 if (DC->hasExternalLexicalStorage()) {
1805 bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1806 setHasLazyLocalLexicalLookups(
1807 hasLazyLocalLexicalLookups() | LoadedDecls );
1811 if (!hasLazyLocalLexicalLookups())
1815 for (
auto *DC : Contexts)
1819 setHasLazyLocalLexicalLookups(
false);
1837 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1839 (!ND->isFromASTFile() ||
1842 makeDeclVisibleInContextImpl(ND,
Internal);
1847 if (
auto *InnerCtx = dyn_cast<DeclContext>(
D))
1848 if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1849 buildLookupImpl(InnerCtx,
Internal);
1860 if (PrimaryContext !=
this)
1861 return PrimaryContext->
lookup(Name);
1868 (void)cast<Decl>(
this)->getMostRecentDecl();
1871 assert(Source &&
"external visible storage but no external source?");
1873 if (hasNeedToReconcileExternalVisibleStorage())
1874 reconcileExternalVisibleStorage();
1878 if (hasLazyLocalLexicalLookups() ||
1879 hasLazyExternalLexicalLookups())
1887 std::pair<StoredDeclsMap::iterator, bool> R =
1889 if (!R.second && !R.first->second.hasExternalDecls())
1890 return R.first->second.getLookupResult();
1894 StoredDeclsMap::iterator I = Map->find(Name);
1895 if (I != Map->end())
1896 return I->second.getLookupResult();
1904 if (hasLazyLocalLexicalLookups() ||
1905 hasLazyExternalLexicalLookups())
1911 StoredDeclsMap::iterator I = Map->find(Name);
1912 if (I == Map->end())
1915 return I->second.getLookupResult();
1925 if (PrimaryContext !=
this)
1928 loadLazyLocalLexicalLookups();
1933 StoredDeclsMap::iterator I = Map->find(Name);
1934 return I != Map->end() ? I->second.getLookupResult()
1941void DeclContext::loadLazyLocalLexicalLookups() {
1942 if (hasLazyLocalLexicalLookups()) {
1945 for (
auto *Context : Contexts)
1947 setHasLazyLocalLexicalLookups(
false);
1959 Results.insert(Results.end(), LookupResults.
begin(), LookupResults.
end());
1960 if (!Results.empty())
1966 if (Name && !hasLazyLocalLexicalLookups() &&
1967 !hasLazyExternalLexicalLookups()) {
1969 StoredDeclsMap::iterator Pos = Map->find(Name);
1970 if (Pos != Map->end()) {
1971 Results.insert(Results.end(),
1972 Pos->second.getLookupResult().begin(),
1973 Pos->second.getLookupResult().end());
1984 if (
auto *ND = dyn_cast<NamedDecl>(
D))
1985 if (ND->getDeclName() == Name)
1986 Results.push_back(ND);
1998 bool SkipRecords =
getDeclKind() == Decl::Kind::Enum &&
2021 OutermostRD = cast<RecordDecl>(DC);
2036 const auto *NS = dyn_cast<NamespaceDecl>(O);
2037 if (!NS || !NS->isInline())
2050 PrimaryDC->makeDeclVisibleInContextWithFlags(
D,
false, PrimaryDC == DeclDC);
2060 ->makeDeclVisibleInContextWithFlags(
D,
Internal, Recoverable);
2084 makeDeclVisibleInContextImpl(
D,
Internal);
2086 setHasLazyLocalLexicalLookups(
true);
2093 makeDeclVisibleInContextWithFlags(
D,
Internal, Recoverable);
2095 auto *DCAsDecl = cast<Decl>(
this);
2097 if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
2099 L->AddedVisibleDecl(
this,
D);
2107 Map = CreateStoredDeclsMap(*
C);
2117 Map->find(
D->getDeclName()) == Map->end())
2137 return cast<UsingDirectiveDecl>(*I);
2154 assert(!LookupPtr &&
"context already has a decls map");
2156 "creating decls map on non-primary context");
2164 M->Previous =
C.LastSDM;
2165 C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M,
Dependent);
2170void ASTContext::ReleaseDeclContextMaps() {
2175 LastSDM.setPointer(
nullptr);
2181 llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
2188 Map = Next.getPointer();
2196 assert(
Parent->isDependentContext()
2197 &&
"cannot iterate dependent diagnostics of non-dependent context");
2200 Parent->CreateStoredDeclsMap(
C);
2213 DD->NextDiagnostic = Map->FirstDiagnostic;
2214 Map->FirstDiagnostic = DD;
2220 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 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 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
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
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isFromGlobalModule() const
Whether this declaration comes from global module.
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setAttrs(const AttrVec &Attrs)
bool hasLocalOwningModuleStorage() const
bool isFunctionPointerType() const
bool isInNamedModule() const
Whether this declaration comes from a named module.
ExternalSourceSymbolAttr * getExternalSourceSymbolAttr() const
Looks on this and related declarations for an applicable external source symbol attribute.
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
bool isParameterPack() const
Whether this declaration is a parameter pack.
ASTMutationListener * getASTMutationListener() const
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
static unsigned getIdentifierNamespaceForKind(Kind DK)
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isFileContextDecl() const
static Decl * castFromDeclContext(const DeclContext *)
Decl * getNextDeclInContext()
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
SourceLocation getBodyRBrace() const
getBodyRBrace - Gets the right brace of the body, if a body exists.
bool isReferenced() const
Whether any declaration of this entity was referenced.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
llvm::PointerIntPair< Decl *, 3, ModuleOwnershipKind > NextInContextAndBits
The next declaration within the same lexical DeclContext.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool canBeWeakImported(bool &IsDefinition) const
Determines whether this symbol can be weak-imported, e.g., whether it would be well-formed to add the...
static DeclContext * castToDeclContext(const Decl *)
const TemplateParameterList * getDescribedTemplateParams() const
If this is a declaration that describes some template or partial specialization, this returns the cor...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
const Attr * getDefiningAttr() const
Return this declaration's defining attribute if it has one.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_OMPReduction
This declaration is an OpenMP user defined reduction construction.
@ IDNS_Label
Labels, declared with 'x:' and referenced with 'goto x'.
@ IDNS_Member
Members, declared with object declarations within tag definitions.
@ IDNS_OMPMapper
This declaration is an OpenMP user defined mapper.
@ IDNS_ObjCProtocol
Objective C @protocol.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_Using
This declaration is a using declaration.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setLocalOwningModule(Module *M)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
unsigned Access
Access - Used by C++ decls for the access specifier.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
bool isInAnonymousNamespace() const
static void EnableStatistics()
TranslationUnitDecl * getTranslationUnitDecl()
VersionTuple getVersionIntroduced() const
Retrieve the version of the target platform in which this declaration was introduced.
bool hasOwningModule() const
Is this declaration owned by some module?
bool isFromHeaderUnit() const
Whether this declaration comes from a header unit.
void 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.
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)
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 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?
This represents a decl that may have a name.
Represent a C++ namespace.
The basic abstraction for the target Objective-C runtime.
bool hasWeakClassImport() const
Does this runtime support weakly importing classes?
PointerType - C99 6.7.5.1 - Pointer Declarators.
void print(raw_ostream &OS) const override
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getCanonicalType() const
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
void print(raw_ostream &OS, const SourceManager &SM) const
Stmt - This represents one statement.
An array of decls optimized for the common case of only containing one entry.
void setHasExternalDecls()
void addOrReplaceDecl(NamedDecl *D)
If this is a redeclaration of an existing decl, replace the old one with D.
void prependDeclNoReplace(NamedDecl *D)
Add a declaration to the list without checking if it replaces anything.
static void DestroyAll(StoredDeclsMap *Map, bool Dependent)
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.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ 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