40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/STLForwardCompat.h"
42#include "llvm/ADT/SmallPtrSet.h"
43#include "llvm/ADT/TinyPtrVector.h"
44#include "llvm/ADT/edit_distance.h"
45#include "llvm/Support/Casting.h"
46#include "llvm/Support/ErrorHandling.h"
55#include "OpenCLBuiltins.inc"
61 class UnqualUsingEntry {
68 : Nominated(Nominated), CommonAncestor(CommonAncestor) {
72 return CommonAncestor;
81 bool operator()(
const UnqualUsingEntry &L,
const UnqualUsingEntry &R) {
82 return L.getCommonAncestor() < R.getCommonAncestor();
85 bool operator()(
const UnqualUsingEntry &
E,
const DeclContext *DC) {
86 return E.getCommonAncestor() < DC;
89 bool operator()(
const DeclContext *DC,
const UnqualUsingEntry &
E) {
90 return DC <
E.getCommonAncestor();
97 class UnqualUsingDirectiveSet {
106 UnqualUsingDirectiveSet(
Sema &SemaRef) : SemaRef(SemaRef) {}
108 void visitScopeChain(
Scope *S,
Scope *InnermostFileScope) {
116 for (; S; S = S->getParent()) {
121 if (Ctx && Ctx->isFileContext()) {
123 }
else if (!Ctx || Ctx->isFunctionOrMethod()) {
124 for (
auto *I : S->using_directives())
126 visit(I, InnermostFileDC);
139 if (!visited.insert(DC).second)
142 addUsingDirectives(DC, EffectiveDC);
150 if (!visited.insert(NS).second)
153 addUsingDirective(UD, EffectiveDC);
154 addUsingDirectives(NS, EffectiveDC);
165 if (SemaRef.
isVisible(UD) && visited.insert(NS).second) {
166 addUsingDirective(UD, EffectiveDC);
174 DC = queue.pop_back_val();
189 while (!Common->
Encloses(EffectiveDC))
196 void done() { llvm::sort(list, UnqualUsingEntry::Comparator()); }
198 typedef ListTy::const_iterator const_iterator;
200 const_iterator begin()
const {
return list.begin(); }
201 const_iterator end()
const {
return list.end(); }
203 llvm::iterator_range<const_iterator>
205 return llvm::make_range(std::equal_range(begin(), end(),
207 UnqualUsingEntry::Comparator()));
237 assert(!
Redeclaration &&
"cannot do redeclaration operator lookup");
276 assert(
Redeclaration &&
"should only be used for redecl lookup");
303void LookupResult::configure() {
314 case OO_Array_Delete:
325 if (
unsigned BuiltinID =
Id->getBuiltinID()) {
332bool LookupResult::checkDebugAssumptions()
const {
337 (Decls.
size() == 1 &&
338 isa<FunctionTemplateDecl>((*
begin())->getUnderlyingDecl())));
342 (Decls.
size() == 1 &&
345 assert((Paths !=
nullptr) ==
380 !isa<UsingShadowDecl>(Existing))
383 const auto *DUnderlying =
D->getUnderlyingDecl();
394 if (DUnderlying->getCanonicalDecl() != EUnderlying->getCanonicalDecl()) {
395 assert(isa<TypeDecl>(DUnderlying) && isa<TypeDecl>(EUnderlying));
396 bool HaveTag = isa<TagDecl>(EUnderlying);
399 return HaveTag != WantTag;
406 if (
const auto *DFD = dyn_cast<FunctionDecl>(DUnderlying)) {
407 const auto *EFD = cast<FunctionDecl>(EUnderlying);
408 unsigned DMin = DFD->getMinRequiredArguments();
409 unsigned EMin = EFD->getMinRequiredArguments();
418 if (
const auto *DTD = dyn_cast<TemplateDecl>(DUnderlying)) {
419 const auto *ETD = cast<TemplateDecl>(EUnderlying);
420 unsigned DMin = DTD->getTemplateParameters()->getMinRequiredArguments();
421 unsigned EMin = ETD->getTemplateParameters()->getMinRequiredArguments();
430 for (
unsigned I = DMin, N = DTD->getTemplateParameters()->size();
433 ETD->getTemplateParameters()->getParam(I)) &&
435 DTD->getTemplateParameters()->getParam(I)))
442 if (
const auto *DVD = dyn_cast<VarDecl>(DUnderlying)) {
443 const auto *EVD = cast<VarDecl>(EUnderlying);
444 if (EVD->getType()->isIncompleteType() &&
445 !DVD->getType()->isIncompleteType()) {
453 if (!isa<FunctionDecl>(DUnderlying) && !isa<VarDecl>(DUnderlying)) {
462 if (Prev == EUnderlying)
481 D =
D->getUnderlyingDecl();
482 return isa<VarDecl>(
D) || isa<EnumConstantDecl>(
D) || isa<FunctionDecl>(
D) ||
483 isa<FunctionTemplateDecl>(
D) || isa<FieldDecl>(
D) ||
484 isa<UnresolvedUsingValueDecl>(
D);
489 unsigned N = Decls.
size();
502 if (isa<FunctionTemplateDecl>(
D))
504 else if (isa<UnresolvedUsingValueDecl>(
D))
513 llvm::SmallDenseMap<const NamedDecl *, unsigned, 16> Unique;
514 llvm::SmallDenseMap<QualType, unsigned, 16> UniqueTypes;
517 bool ReferenceToPlaceHolderVariable =
false;
518 bool HasTag =
false, HasFunction =
false;
519 bool HasFunctionTemplate =
false, HasUnresolved =
false;
520 const NamedDecl *HasNonFunction =
nullptr;
523 llvm::BitVector RemovedDecls(N);
525 for (
unsigned I = 0; I < N; I++) {
526 const NamedDecl *
D = Decls[I]->getUnderlyingDecl();
532 N - RemovedDecls.count() > 1) {
544 if (HideTags && isa<TagDecl>(
D)) {
546 for (
auto *OtherDecl : Decls) {
547 if (
canHideTag(OtherDecl) && !OtherDecl->isInvalidDecl() &&
559 std::optional<unsigned> ExistingI;
565 if (
const auto *TD = dyn_cast<TypeDecl>(
D)) {
566 auto UniqueResult = UniqueTypes.insert(
568 if (!UniqueResult.second) {
570 ExistingI = UniqueResult.first->second;
577 auto UniqueResult = Unique.insert(std::make_pair(
D, I));
578 if (!UniqueResult.second) {
580 ExistingI = UniqueResult.first->second;
589 Decls[*ExistingI] = Decls[I];
596 if (isa<UnresolvedUsingValueDecl>(
D)) {
597 HasUnresolved =
true;
598 }
else if (isa<TagDecl>(
D)) {
602 }
else if (isa<FunctionTemplateDecl>(
D)) {
604 HasFunctionTemplate =
true;
605 }
else if (isa<FunctionDecl>(
D)) {
608 if (HasNonFunction) {
613 if (
getSema().isEquivalentInternalLinkageDeclaration(HasNonFunction,
615 EquivalentNonFunctions.push_back(
D);
619 if (
D->isPlaceholderVar(
getSema().getLangOpts()) &&
622 ReferenceToPlaceHolderVariable =
true;
632 if (!EquivalentNonFunctions.empty() && !
Ambiguous)
634 getNameLoc(), HasNonFunction, EquivalentNonFunctions);
639 for (
int I = RemovedDecls.find_last(); I >= 0; I = RemovedDecls.find_prev(I))
640 Decls[I] = Decls[--N];
643 if ((HasNonFunction && (HasFunction || HasUnresolved)) ||
644 (HideTags && HasTag && (HasFunction || HasNonFunction || HasUnresolved)))
647 if (
Ambiguous && ReferenceToPlaceHolderVariable)
651 else if (HasUnresolved)
653 else if (N > 1 || HasFunctionTemplate)
659void LookupResult::addDeclsFromBasePaths(
const CXXBasePaths &
P) {
661 for (I =
P.begin(),
E =
P.end(); I !=
E; ++I)
670 addDeclsFromBasePaths(*Paths);
678 addDeclsFromBasePaths(*Paths);
684 Out << Decls.
size() <<
" result(s)";
686 if (Paths) Out <<
", base paths present";
703 llvm::StringRef Name) {
705 << TypeClass << Name;
748 Sema &S,
const OpenCLBuiltinStruct &OpenCLBuiltin,
unsigned &GenTypeMaxCnt,
752 unsigned Sig = SignatureTable[OpenCLBuiltin.SigTableIndex];
753 OCL2Qual(S, TypeTable[Sig], RetTypes);
754 GenTypeMaxCnt = RetTypes.size();
758 for (
unsigned Index = 1; Index < OpenCLBuiltin.NumTypes; Index++) {
760 OCL2Qual(S, TypeTable[SignatureTable[OpenCLBuiltin.SigTableIndex + Index]],
762 GenTypeMaxCnt = (Ty.size() > GenTypeMaxCnt) ? Ty.size() : GenTypeMaxCnt;
763 ArgTypes.push_back(std::move(Ty));
786 if (RetTypes.size() == 0)
790 for (
unsigned IGenType = 0; IGenType < GenTypeMaxCnt; IGenType++) {
793 for (
unsigned A = 0; A < ArgTypes.size(); A++) {
795 if (ArgTypes[A].size() == 0)
801 assert(GenTypeMaxCnt % ArgTypes[A].size() == 0 &&
802 "argument type count not compatible with gentype type count");
803 unsigned Idx = IGenType % ArgTypes[A].size();
804 ArgList.push_back(ArgTypes[A][Idx]);
808 RetTypes[(RetTypes.size() != 1) ? IGenType : 0], ArgList, PI));
823 const unsigned FctIndex,
824 const unsigned Len) {
826 bool HasGenType =
false;
830 unsigned GenTypeMaxCnt;
834 for (
unsigned SignatureIndex = 0; SignatureIndex < Len; SignatureIndex++) {
835 const OpenCLBuiltinStruct &OpenCLBuiltin =
836 BuiltinTable[FctIndex + SignatureIndex];
840 if (!isOpenCLVersionContainedInMask(Context.
getLangOpts(),
841 OpenCLBuiltin.Versions))
847 StringRef Extensions = FunctionExtensionTable[OpenCLBuiltin.Extension];
848 if (!Extensions.empty()) {
850 Extensions.split(ExtVec,
" ");
851 bool AllExtensionsDefined =
true;
852 for (StringRef Ext : ExtVec) {
854 AllExtensionsDefined =
false;
858 if (!AllExtensionsDefined)
868 if (GenTypeMaxCnt > 1) {
873 std::vector<QualType> FunctionList;
881 for (
const auto &FTy : FunctionList) {
885 FTy->isFunctionProtoType());
890 const auto *FP = cast<FunctionProtoType>(FTy);
892 for (
unsigned IParm = 0, e = FP->getNumParams(); IParm != e; ++IParm) {
895 nullptr, FP->getParamType(IParm),
nullptr,
SC_None,
nullptr);
897 ParmList.push_back(Parm);
899 NewOpenCLBuiltin->setParams(ParmList);
902 if (OpenCLBuiltin.IsPure)
903 NewOpenCLBuiltin->
addAttr(PureAttr::CreateImplicit(Context));
904 if (OpenCLBuiltin.IsConst)
905 NewOpenCLBuiltin->
addAttr(ConstAttr::CreateImplicit(Context));
906 if (OpenCLBuiltin.IsConv)
907 NewOpenCLBuiltin->
addAttr(ConvergentAttr::CreateImplicit(Context));
910 NewOpenCLBuiltin->
addAttr(OverloadableAttr::CreateImplicit(Context));
917 if (Len > 1 || HasGenType)
933#define BuiltinTemplate(BIName)
934#define CPlusPlusBuiltinTemplate(BIName) \
935 if (II == getASTContext().get##BIName##Name()) { \
936 R.addDecl(getASTContext().get##BIName##Decl()); \
939#include "clang/Basic/BuiltinTemplates.inc"
942#define BuiltinTemplate(BIName)
943#define HLSLBuiltinTemplate(BIName) \
944 if (II == getASTContext().get##BIName##Name()) { \
945 R.addDecl(getASTContext().get##BIName##Decl()); \
948#include "clang/Basic/BuiltinTemplates.inc"
954 auto Index = isOpenCLBuiltin(II->
getName());
962 if (
RISCV().DeclareRVVBuiltins ||
RISCV().DeclareSiFiveVectorBuiltins ||
963 RISCV().DeclareAndesVectorBuiltins) {
964 if (!
RISCV().IntrinsicManager)
969 if (
RISCV().IntrinsicManager->CreateIntrinsicIfFound(R, II,
PP))
1008 if (ID == Builtin::BIobjc_msgSendSuper)
1016 if (!
Class->getDefinition() ||
Class->isDependentContext())
1020 return !
Class->isBeingDefined();
1028 if (
Class->needsImplicitDefaultConstructor())
1032 if (
Class->needsImplicitCopyConstructor())
1036 if (
Class->needsImplicitCopyAssignment())
1041 if (
Class->needsImplicitMoveConstructor())
1045 if (
Class->needsImplicitMoveAssignment())
1050 if (
Class->needsImplicitDestructor())
1057 switch (Name.getNameKind()) {
1063 return Name.getCXXOverloadedOperator() == OO_Equal;
1081 switch (Name.getNameKind()) {
1086 if (
Record->needsImplicitDefaultConstructor())
1088 if (
Record->needsImplicitCopyConstructor())
1091 Record->needsImplicitMoveConstructor())
1098 if (
Record->getDefinition() &&
Record->needsImplicitDestructor() &&
1104 if (Name.getCXXOverloadedOperator() != OO_Equal)
1110 if (
Record->needsImplicitCopyAssignment())
1113 Record->needsImplicitMoveAssignment())
1153 !isa<CXXRecordDecl>(DC))
1161 if (!
Record->isCompleteDefinition())
1167 auto *ContainedDeducedType =
1171 ContainedDeducedType && ContainedDeducedType->isUndeducedType())
1175 UEnd =
Record->conversion_end();
U != UEnd; ++
U) {
1205 assert(ConvProto &&
"Nonsensical conversion function template type");
1232 UnqualUsingDirectiveSet &UDirs) {
1234 assert(NS && NS->
isFileContext() &&
"CppNamespaceLookup() requires namespace!");
1241 for (
const UnqualUsingEntry &UUE : UDirs.getNamespacesFor(NS))
1252 return Ctx->isFileContext();
1260 for (
Scope *OuterS = S->getParent(); OuterS; OuterS = OuterS->getParent())
1269struct FindLocalExternScope {
1271 : R(R), OldFindLocalExtern(R.getIdentifierNamespace() &
1272 Decl::IDNS_LocalExtern) {
1279 ~FindLocalExternScope() {
1283 bool OldFindLocalExtern;
1308 Name.getCXXNameType()->isDependentType()) {
1339 UnqualUsingDirectiveSet UDirs(*
this);
1340 bool VisitedUsingDirectives =
false;
1341 bool LeftStartingScope =
false;
1344 FindLocalExternScope FindLocals(R);
1347 bool SearchNamespaceScope =
true;
1349 for (; I != IEnd && S->isDeclScope(*I); ++I) {
1352 !(*I)->isTemplateParameter()) {
1358 if (!LeftStartingScope && !Initial->
isDeclScope(*I))
1359 LeftStartingScope =
true;
1363 if (LeftStartingScope && !((*I)->hasLinkage())) {
1370 SearchNamespaceScope =
false;
1375 if (!SearchNamespaceScope) {
1377 if (S->isClassScope())
1378 if (
auto *
Record = dyn_cast_if_present<CXXRecordDecl>(S->getEntity()))
1394 for (; Ctx && !Ctx->Equals(OuterCtx); Ctx = Ctx->getLookupParent()) {
1398 if (Ctx->isTransparentContext())
1404 if (Ctx->isFunctionOrMethod()) {
1408 if (
Method->isInstanceMethod() && Name.getAsIdentifierInfo())
1412 Name.getAsIdentifierInfo(),
1428 if (Ctx->isFileContext()) {
1430 if (!VisitedUsingDirectives) {
1433 if (UCtx->isTransparentContext())
1436 UDirs.visit(UCtx, UCtx);
1441 Scope *InnermostFileScope = S;
1442 while (InnermostFileScope &&
1444 InnermostFileScope = InnermostFileScope->
getParent();
1445 UDirs.visitScopeChain(Initial, InnermostFileScope);
1449 VisitedUsingDirectives =
true;
1474 if (!S)
return false;
1485 if (!VisitedUsingDirectives) {
1486 UDirs.visitScopeChain(Initial, S);
1493 FindLocals.restore();
1499 for (; S; S = S->getParent()) {
1502 for (; I != IEnd && S->isDeclScope(*I); ++I) {
1513 if (
Found && S->isTemplateParamScope()) {
1521 for (; Ctx && !Ctx->Equals(OuterCtx); Ctx = Ctx->getLookupParent()) {
1525 if (Ctx->isTransparentContext())
1531 if (!(
Found && S->isTemplateParamScope())) {
1532 assert(Ctx->isFileContext() &&
1533 "We should have been looking only at file context here already.");
1566 if (
auto *TD = dyn_cast<TemplateDecl>(ND))
1567 for (
auto *Param : *TD->getTemplateParameters())
1575 if (
auto *ED = dyn_cast<EnumDecl>(ND);
1576 ED && ED->isFromGlobalModule() && !ED->isScoped()) {
1577 for (
auto *ECD : ED->enumerators()) {
1578 ECD->setVisibleDespiteOwningModule();
1580 if (RedeclCtx->
lookup(ECD->getDeclName()).
empty())
1588 if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(Entity)) {
1593 }
else if (
CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(Entity)) {
1596 }
else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Entity)) {
1597 if (
auto *Pattern = ED->getTemplateInstantiationPattern())
1599 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(Entity)) {
1607 if (Context->isFileContext())
1626bool Sema::isUsableModule(
const Module *M) {
1627 assert(M &&
"We shouldn't check nullness for module here");
1629 if (UsableModuleUnitsCache.count(M))
1637 if (M == TheGlobalModuleFragment || M == TheImplicitGlobalModuleFragment) {
1638 UsableModuleUnitsCache.insert(M);
1656 if (Current->isImplicitGlobalModule())
1657 Current = Current->getTopLevelModule();
1667 if (llvm::count_if(ModuleScopes,
1668 [&M](
const ModuleScope &MS) {
return MS.Module == M; }) ||
1670 UsableModuleUnitsCache.insert(M);
1686 if (isUsableModule(Merged))
1691template <
typename ParmDecl>
1696 if (!
D->hasDefaultArgument())
1701 auto &DefaultArg =
D->getDefaultArgStorage();
1705 if (!DefaultArg.isInherited() && Modules) {
1706 auto *NonConstD =
const_cast<ParmDecl*
>(
D);
1712 D = DefaultArg.getInheritedFrom();
1720 if (
auto *
P = dyn_cast<TemplateTypeParmDecl>(
D))
1721 return ::hasAcceptableDefaultArgument(*
this,
P, Modules, Kind);
1723 if (
auto *
P = dyn_cast<NonTypeTemplateParmDecl>(
D))
1724 return ::hasAcceptableDefaultArgument(*
this,
P, Modules, Kind);
1726 return ::hasAcceptableDefaultArgument(
1727 *
this, cast<TemplateTemplateParmDecl>(
D), Modules, Kind);
1742template <
typename Filter>
1747 bool HasFilteredRedecls =
false;
1749 for (
auto *Redecl :
D->
redecls()) {
1750 auto *R = cast<NamedDecl>(Redecl);
1757 HasFilteredRedecls =
true;
1760 Modules->push_back(R->getOwningModule());
1764 if (HasFilteredRedecls)
1777 if (
auto *RD = dyn_cast<CXXRecordDecl>(
D))
1778 return RD->getTemplateSpecializationKind() ==
1780 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1781 return FD->getTemplateSpecializationKind() ==
1783 if (
auto *VD = dyn_cast<VarDecl>(
D))
1784 return VD->getTemplateSpecializationKind() ==
1786 llvm_unreachable(
"unknown explicit specialization kind");
1793 return ::hasAcceptableExplicitSpecialization(*
this,
D, Modules,
1799 return ::hasAcceptableExplicitSpecialization(*
this,
D, Modules,
1808 "not a member specialization");
1849 "should not call this: not in slow case");
1852 assert(DeclModule &&
"hidden decl has no owning module");
1862 auto IsEffectivelyFileContext = [](
const DeclContext *DC) {
1864 isa<ExportDecl>(DC);
1870 if (DC && !IsEffectivelyFileContext(DC)) {
1878 bool AcceptableWithinParent;
1880 bool SearchDefinitions =
true;
1881 if (
const auto *DCD = dyn_cast<Decl>(DC)) {
1882 if (
const auto *TD = DCD->getDescribedTemplate()) {
1885 SearchDefinitions = Index >= TPL->
size() || TPL->
getParam(Index) !=
D;
1888 if (SearchDefinitions)
1889 AcceptableWithinParent =
1892 AcceptableWithinParent =
1894 }
else if (isa<ParmVarDecl>(
D) ||
1895 (isa<FunctionDecl>(DC) && !SemaRef.
getLangOpts().CPlusPlus))
1896 AcceptableWithinParent =
isAcceptable(SemaRef, cast<NamedDecl>(DC), Kind);
1900 AcceptableWithinParent =
false;
1903 AcceptableWithinParent =
true;
1907 }
while (!IsEffectivelyFileContext(DC));
1909 AcceptableWithinParent =
1921 return AcceptableWithinParent;
1928 "Additional Sema::AcceptableKind?");
1929 return isReachableSlow(SemaRef,
D);
1935 if (ModulePrivate && isUsableModule(M))
1940 if (!ModulePrivate && VisibleModules.
isVisible(M))
1948 if (LookupModules.empty())
1952 if (LookupModules.count(M))
1966 return llvm::any_of(LookupModules, [&](
const Module *LookupM) {
1974 assert(!
isVisible(SemaRef,
D) &&
"Shouldn't call the slow case.\n");
1977 assert(DeclModule &&
"hidden decl has no owning module");
2059 assert(
D->isExternallyDeclarable() &&
2060 "should not have hidden, non-externally-declarable result here");
2079 return New->isExternallyDeclarable();
2099 auto ND = cast<NamedDecl>(RD);
2103 if (ND->isInIdentifierNamespace(IDNS) &&
2115 *
this,
D, Modules, [](
const NamedDecl *) {
return true; },
2123 *
this,
D, Modules, [](
const NamedDecl *) {
return true; },
2128 if (
auto *ND = dyn_cast<NamespaceDecl>(
D)) {
2136 if (
auto *Acceptable =
getSema().VisibleNamespaceCache.lookup(Key))
2190 if (
auto *FD = dyn_cast<FunctionDecl>(ND);
2191 FD && FD->isReservedGlobalPlacementOperator())
2208 if (
auto *TD = dyn_cast<TagDecl>(DC))
2215 bool ForceNoCPlusPlus) {
2217 if (!Name)
return false;
2227 (S->getEntity() && S->getEntity()->isTransparentContext()))
2232 FindLocalExternScope FindLocals(R);
2238 bool LeftStartingScope =
false;
2247 if (!LeftStartingScope && !S->isDeclScope(*I))
2248 LeftStartingScope =
true;
2252 if (LeftStartingScope && !((*I)->hasLinkage())) {
2258 !isa<ImplicitParamDecl>(*I))
2268 while (S && !S->isDeclScope(
D))
2283 for (++LastI; LastI != IEnd; ++LastI) {
2286 if (!S->isDeclScope(*LastI))
2308 if (CppLookupName(R, S))
2354 assert(StartDC->
isFileContext() &&
"start context is not a file context");
2367 NamespaceDecl *ND = I->getNominatedNamespace()->getFirstDecl();
2369 Queue.push_back(ND);
2376 bool FoundTag =
false;
2377 bool FoundNonTag =
false;
2382 while (!Queue.empty()) {
2387 bool UseLocal = !R.
empty();
2417 Queue.push_back(Nom);
2422 if (FoundTag && FoundNonTag)
2432 bool InUnqualifiedLookup) {
2433 assert(LookupCtx &&
"Sema::LookupQualifiedName requires a lookup context");
2440 if (
const auto *TD = dyn_cast<TagDecl>(LookupCtx);
2441 TD && !TD->isDependentType() && TD->getDefinition() ==
nullptr)
2442 llvm_unreachable(
"Declaration context must already be complete!");
2445 struct QualifiedLookupInScope {
2453 ~QualifiedLookupInScope() {
2454 Context->setUseQualifiedLookup(oldVal);
2458 CXXRecordDecl *LookupRec = dyn_cast<CXXRecordDecl>(LookupCtx);
2473 Name.getCXXNameType()->isDependentType()) {
2533 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
2538 if ((*
Path.Decls)->isInIdentifierNamespace(IDNS))
2545 Paths.setOrigin(LookupRec);
2558 int SubobjectNumber = 0;
2564 if ((*I)->isInIdentifierNamespace(IDNS) && (*I)->isCXXInstanceMember())
2576 using Result =
const void *;
2578 auto Next = [&](Iterator &It, Iterator End) ->
Result {
2592 if (TemplateNameLookup)
2609 Iterator AIt = A, BIt = B, AEnd, BEnd;
2611 Result AResult = Next(AIt, AEnd);
2612 Result BResult = Next(BIt, BEnd);
2613 if (!AResult && !BResult)
2615 if (!AResult || !BResult)
2617 if (AResult != BResult) {
2620 llvm::SmallDenseMap<Result, bool, 32> AResults;
2621 for (; AResult; AResult = Next(AIt, AEnd))
2622 AResults.insert({AResult,
false});
2624 for (; BResult; BResult = Next(BIt, BEnd)) {
2625 auto It = AResults.find(BResult);
2626 if (It == AResults.end())
2633 return AResults.size() ==
Found;
2644 SubobjectAccess = std::min(SubobjectAccess,
Path->Access);
2647 if (SubobjectType.isNull()) {
2654 if (SubobjectType !=
2662 if (HasOnlyStaticMembers(
Path->Decls) &&
2663 HasSameDeclarations(Paths.begin()->Decls,
Path->Decls))
2666 R.setAmbiguousBaseSubobjectTypes(Paths);
2680 if (HasOnlyStaticMembers(
Path->Decls))
2685 R.setAmbiguousBaseSubobjects(Paths);
2696 if (
NamedDecl *ND = R.getAcceptableDecl(*I))
2712 QualType ObjectType,
bool AllowBuiltinCreation,
2713 bool EnteringContext) {
2720 bool IsDependent =
false;
2721 if (!ObjectType.
isNull()) {
2724 assert((!SS || SS->
isEmpty()) &&
2725 "ObjectType and scope specifier cannot coexist");
2733 "Caller should have completed object type");
2752 return LookupName(R, S, AllowBuiltinCreation);
2759 else if (IsDependent)
2772 for (
const auto &BaseSpec :
Class->bases()) {
2773 auto *RD = BaseSpec.getType()->castAsCXXRecordDecl();
2786 Result.suppressDiagnostics();
2796 assert(
Result.isAmbiguous() &&
"Lookup result must be ambiguous");
2802 switch (
Result.getAmbiguityKind()) {
2805 QualType SubobjectType = Paths->front().back().Base->getType();
2806 Diag(NameLoc, diag::err_ambiguous_member_multiple_subobjects)
2811 while (isa<CXXMethodDecl>(*
Found) &&
2812 cast<CXXMethodDecl>(*Found)->isStatic())
2815 Diag((*Found)->getLocation(), diag::note_ambiguous_member_found);
2820 Diag(NameLoc, diag::err_ambiguous_member_multiple_subobject_types)
2821 << Name << LookupRange;
2824 std::set<const NamedDecl *> DeclsPrinted;
2826 PathEnd = Paths->end();
2831 if (DeclsPrinted.insert(
D).second) {
2832 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
D->getUnderlyingDecl()))
2834 << TD->getUnderlyingType();
2835 else if (
const auto *TD = dyn_cast<TypeDecl>(
D->getUnderlyingDecl()))
2846 Diag(NameLoc, diag::err_ambiguous_tag_hiding) << Name << LookupRange;
2851 if (
TagDecl *TD = dyn_cast<TagDecl>(
D)) {
2852 TagDecls.insert(TD);
2853 Diag(TD->getLocation(), diag::note_hidden_tag);
2857 if (!isa<TagDecl>(
D))
2863 if (TagDecls.count(F.
next()))
2871 Diag(NameLoc, diag::err_using_placeholder_variable) << Name << LookupRange;
2883 Diag(NameLoc, diag::err_ambiguous_reference) << Name << LookupRange;
2893 struct AssociatedLookup {
2897 : S(S), Namespaces(Namespaces), Classes(Classes),
2898 InstantiationLoc(InstantiationLoc) {
2903 return ClassesTransitive.insert(RD);
2939 while (!Ctx->isFileContext() || Ctx->isInlineNamespace())
2940 Ctx = Ctx->getParent();
2945 DeclContext *PrimaryCtx = Ctx->getPrimaryContext();
2946 Decl *PrimaryD = cast<Decl>(PrimaryCtx);
2947 Decl *
D = cast<Decl>(Ctx);
2990 Namespaces.insert(Ctx);
2992 Namespaces.insert(PrimaryCtx);
3020 = dyn_cast<ClassTemplateDecl>(
Template.getAsTemplateDecl())) {
3021 DeclContext *Ctx = ClassTemplate->getDeclContext();
3022 if (
CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
3023 Result.Classes.insert(EnclosingClass);
3053 if (
Class->getDeclName() ==
Result.S.VAListTagName)
3066 if (
CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
3067 Result.Classes.insert(EnclosingClass);
3082 = dyn_cast<ClassTemplateSpecializationDecl>(
Class)) {
3083 DeclContext *Ctx = Spec->getSpecializedTemplate()->getDeclContext();
3084 if (
CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
3085 Result.Classes.insert(EnclosingClass);
3090 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
3107 Bases.push_back(
Class);
3108 while (!Bases.empty()) {
3110 Class = Bases.pop_back_val();
3113 for (
const auto &
Base :
Class->bases()) {
3123 if (
Result.addClassTransitive(BaseDecl)) {
3129 if (!BaseDecl->
bases().empty())
3130 Bases.push_back(BaseDecl);
3158#define TYPE(Class, Base)
3159#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3160#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3161#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3162#define ABSTRACT_TYPE(Class, Base)
3163#include "clang/AST/TypeNodes.inc"
3176 case Type::ConstantArray:
3177 case Type::IncompleteArray:
3178 case Type::VariableArray:
3179 T = cast<ArrayType>(
T)->getElementType().getTypePtr();
3192 case Type::Record: {
3195 cast<CXXRecordDecl>(cast<RecordType>(
T)->getOriginalDecl())
3196 ->getDefinitionOrSelf();
3210 if (
CXXRecordDecl *EnclosingClass = dyn_cast<CXXRecordDecl>(Ctx))
3211 Result.Classes.insert(EnclosingClass);
3222 case Type::FunctionProto: {
3225 Queue.push_back(Arg.getTypePtr());
3229 case Type::FunctionNoProto: {
3244 case Type::MemberPointer: {
3253 case Type::BlockPointer:
3259 case Type::LValueReference:
3260 case Type::RValueReference:
3266 case Type::ExtVector:
3267 case Type::ConstantMatrix:
3274 case Type::DeducedTemplateSpecialization:
3280 case Type::ObjCObject:
3281 case Type::ObjCInterface:
3282 case Type::ObjCObjectPointer:
3283 Result.Namespaces.insert(
Result.S.Context.getTranslationUnitDecl());
3289 T = cast<AtomicType>(
T)->getValueType().getTypePtr();
3292 T = cast<PipeType>(
T)->getElementType().getTypePtr();
3296 case Type::ArrayParameter:
3299 case Type::HLSLAttributedResource:
3300 T = cast<HLSLAttributedResourceType>(
T)->getWrappedType().getTypePtr();
3304 case Type::HLSLInlineSpirv:
3310 T = Queue.pop_back_val();
3318 AssociatedNamespaces.clear();
3319 AssociatedClasses.clear();
3321 AssociatedLookup
Result(*
this, InstantiationLoc,
3322 AssociatedNamespaces, AssociatedClasses);
3331 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
3332 Expr *Arg = Args[ArgIdx];
3380 assert(!Operators.
isAmbiguous() &&
"Operator lookup cannot be ambiguous");
3386 bool ConstArg,
bool VolatileArg,
bool RValueThis,
3387 bool ConstThis,
bool VolatileThis) {
3389 "doing special member lookup into record that isn't fully complete");
3391 if (RValueThis || ConstThis || VolatileThis)
3394 "constructors and destructors always have unqualified lvalue this");
3395 if (ConstArg || VolatileArg)
3398 "parameter-less special members can't have qualified arguments");
3403 llvm::FoldingSetNodeID ID;
3405 ID.AddInteger(llvm::to_underlying(
SM));
3406 ID.AddInteger(ConstArg);
3407 ID.AddInteger(VolatileArg);
3408 ID.AddInteger(RValueThis);
3409 ID.AddInteger(ConstThis);
3410 ID.AddInteger(VolatileThis);
3427 DeclareImplicitDestructor(RD);
3442 Expr *Arg =
nullptr;
3453 DeclareImplicitDefaultConstructor(RD);
3462 DeclareImplicitCopyConstructor(RD);
3467 DeclareImplicitMoveConstructor(RD);
3474 DeclareImplicitCopyAssignment(RD);
3479 DeclareImplicitMoveAssignment(RD);
3532 "lookup for a constructor or assignment operator was empty");
3533 Result->setMethod(
nullptr);
3542 for (
NamedDecl *CandDecl : Candidates) {
3543 if (CandDecl->isInvalidDecl())
3569 CtorInfo.FoundDecl,
nullptr,
3575 assert(isa<UsingDecl>(Cand.
getDecl()) &&
3576 "illegal Kind of operator = Decl");
3583 Result->setMethod(cast<CXXMethodDecl>(Best->Function));
3588 Result->setMethod(cast<CXXMethodDecl>(Best->Function));
3593 Result->setMethod(
nullptr);
3598 Result->setMethod(
nullptr);
3609 false,
false,
false,
false,
false);
3611 return cast_or_null<CXXConstructorDecl>(
Result.getMethod());
3617 "non-const, non-volatile qualifiers for copy ctor arg");
3622 return cast_or_null<CXXConstructorDecl>(
Result.getMethod());
3631 return cast_or_null<CXXConstructorDecl>(
Result.getMethod());
3638 if (Class->needsImplicitDefaultConstructor())
3639 DeclareImplicitDefaultConstructor(Class);
3640 if (Class->needsImplicitCopyConstructor())
3641 DeclareImplicitCopyConstructor(Class);
3642 if (getLangOpts().CPlusPlus11 && Class->needsImplicitMoveConstructor())
3643 DeclareImplicitMoveConstructor(Class);
3649 return Class->lookup(Name);
3653 unsigned Quals,
bool RValueThis,
3654 unsigned ThisQuals) {
3656 "non-const, non-volatile qualifiers for copy assignment arg");
3658 "non-const, non-volatile qualifiers for copy assignment this");
3664 return Result.getMethod();
3670 unsigned ThisQuals) {
3672 "non-const, non-volatile qualifiers for copy assignment this");
3678 return Result.getMethod();
3682 return cast_or_null<CXXDestructorDecl>(
3684 false,
false,
false)
3691 bool AllowTemplate,
bool AllowStringTemplatePack,
3695 "literal operator lookup can't be ambiguous");
3700 bool AllowCooked =
true;
3701 bool FoundRaw =
false;
3702 bool FoundTemplate =
false;
3703 bool FoundStringTemplatePack =
false;
3704 bool FoundCooked =
false;
3709 D = USD->getTargetDecl();
3718 bool IsTemplate =
false;
3719 bool IsStringTemplatePack =
false;
3720 bool IsCooked =
false;
3723 if (FD->getNumParams() == 1 &&
3724 FD->getParamDecl(0)->getType()->getAs<
PointerType>())
3726 else if (FD->getNumParams() == ArgTys.size()) {
3728 for (
unsigned ArgIdx = 0; ArgIdx != ArgTys.size(); ++ArgIdx) {
3729 QualType ParamTy = FD->getParamDecl(ArgIdx)->getType();
3739 if (Params->
size() == 1) {
3763 IsStringTemplatePack =
true;
3767 if (AllowTemplate && StringLit && IsTemplate) {
3768 FoundTemplate =
true;
3770 AllowCooked =
false;
3771 AllowStringTemplatePack =
false;
3772 if (FoundRaw || FoundCooked || FoundStringTemplatePack) {
3774 FoundRaw = FoundCooked = FoundStringTemplatePack =
false;
3776 }
else if (AllowCooked && IsCooked) {
3779 AllowTemplate = StringLit;
3780 AllowStringTemplatePack =
false;
3781 if (FoundRaw || FoundTemplate || FoundStringTemplatePack) {
3785 FoundRaw = FoundTemplate = FoundStringTemplatePack =
false;
3787 }
else if (AllowRaw && IsRaw) {
3789 }
else if (AllowTemplate && IsTemplate) {
3790 FoundTemplate =
true;
3791 }
else if (AllowStringTemplatePack && IsStringTemplatePack) {
3792 FoundStringTemplatePack =
true;
3802 if (StringLit && FoundTemplate)
3813 if (FoundRaw && FoundTemplate) {
3826 if (FoundStringTemplatePack)
3830 if (DiagnoseMissing) {
3833 << (ArgTys.size() == 2 ? ArgTys[1] :
QualType()) << AllowRaw
3834 << (AllowTemplate || AllowStringTemplatePack);
3842 NamedDecl *&Old = Decls[cast<NamedDecl>(
New->getCanonicalDecl())];
3846 if (Old ==
nullptr || Old ==
New) {
3857 Cursor = Cursor->getPreviousDecl();
3861 if (!Cursor)
return;
3864 if (Cursor == OldFD)
break;
3879 AssociatedNamespaces,
3893 for (
auto *
NS : AssociatedNamespaces) {
3913 auto *Underlying =
D;
3914 if (
auto *USD = dyn_cast<UsingShadowDecl>(
D))
3915 Underlying = USD->getTargetDecl();
3917 if (!isa<FunctionDecl>(Underlying) &&
3918 !isa<FunctionTemplateDecl>(Underlying))
3948 llvm::any_of(AssociatedClasses, [&](
auto *
E) {
3952 if (E->getOwningModule() != FM)
3956 DeclContext *Ctx = E->getDeclContext();
3957 while (!Ctx->isFileContext() || Ctx->isInlineNamespace())
3958 Ctx = Ctx->getParent();
3985 Result.insert(Underlying);
3999class ShadowContextRAII;
4001class VisibleDeclsRecord {
4006 typedef llvm::TinyPtrVector<NamedDecl*> ShadowMapEntry;
4011 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
4014 std::list<ShadowMap> ShadowMaps;
4019 friend class ShadowContextRAII;
4025 return !VisitedContexts.insert(Ctx).second;
4029 return VisitedContexts.count(Ctx);
4041 ShadowMaps.back()[ND->
getDeclName()].push_back(ND);
4046class ShadowContextRAII {
4047 VisibleDeclsRecord &Visible;
4049 typedef VisibleDeclsRecord::ShadowMap ShadowMap;
4052 ShadowContextRAII(VisibleDeclsRecord &Visible) : Visible(Visible) {
4053 Visible.ShadowMaps.emplace_back();
4056 ~ShadowContextRAII() {
4057 Visible.ShadowMaps.pop_back();
4065 std::list<ShadowMap>::reverse_iterator
SM = ShadowMaps.rbegin();
4066 for (std::list<ShadowMap>::reverse_iterator SMEnd = ShadowMaps.rend();
4067 SM != SMEnd; ++
SM) {
4069 if (Pos ==
SM->end())
4072 for (
auto *
D : Pos->second) {
4090 SM == ShadowMaps.rbegin())
4095 if (isa<UsingShadowDecl>(ND) && isa<UsingDecl>(
D) &&
4096 cast<UsingShadowDecl>(ND)->getIntroducer() ==
D)
4108class LookupVisibleHelper {
4112 : Consumer(Consumer), IncludeDependentBases(IncludeDependentBases),
4113 LoadExternal(LoadExternal) {}
4116 bool IncludeGlobalScope) {
4120 UnqualUsingDirectiveSet UDirs(SemaRef);
4126 UDirs.visitScopeChain(Initial, S);
4132 Result.setAllowHidden(Consumer.includeHiddenDecls());
4133 if (!IncludeGlobalScope)
4135 ShadowContextRAII Shadow(
Visited);
4136 lookupInScope(Initial, Result, UDirs);
4142 Result.setAllowHidden(Consumer.includeHiddenDecls());
4143 if (!IncludeGlobalScope)
4146 ShadowContextRAII Shadow(
Visited);
4147 lookupInDeclContext(Ctx, Result,
true,
4153 bool QualifiedNameLookup,
bool InBaseClass) {
4158 if (
Visited.visitedContext(Ctx->getPrimaryContext()))
4161 Consumer.EnteredContext(Ctx);
4164 if (isa<TranslationUnitDecl>(Ctx) &&
4166 auto &S = Result.getSema();
4172 Idents.getExternalIdentifierLookup()) {
4173 std::unique_ptr<IdentifierIterator>
Iter(
External->getIdentifiers());
4174 for (StringRef Name =
Iter->Next(); !Name.empty();
4175 Name =
Iter->Next())
4180 for (
const auto &Ident : Idents) {
4185 if (
NamedDecl *ND = Result.getAcceptableDecl(*I)) {
4186 Consumer.FoundDecl(ND,
Visited.checkHidden(ND), Ctx, InBaseClass);
4197 Result.getSema().ForceDeclarationOfImplicitMembers(Class);
4201 bool Load = LoadExternal ||
4202 !(isa<TranslationUnitDecl>(Ctx) || isa<NamespaceDecl>(Ctx));
4205 Load ? Ctx->lookups()
4206 : Ctx->noload_lookups(
false))
4213 DeclsToVisit.push_back(
D);
4215 for (
auto *
D : DeclsToVisit)
4216 if (
auto *ND = Result.getAcceptableDecl(
D)) {
4217 Consumer.FoundDecl(ND,
Visited.checkHidden(ND), Ctx, InBaseClass);
4221 DeclsToVisit.clear();
4224 if (QualifiedNameLookup) {
4225 ShadowContextRAII Shadow(
Visited);
4226 for (
auto *I : Ctx->using_directives()) {
4227 if (!Result.getSema().isVisible(I))
4229 lookupInDeclContext(I->getNominatedNamespace(), Result,
4230 QualifiedNameLookup, InBaseClass);
4236 if (!
Record->hasDefinition())
4239 for (
const auto &B :
Record->bases()) {
4244 if (!IncludeDependentBases) {
4257 RD = TD->getTemplatedDecl();
4284 ShadowContextRAII Shadow(
Visited);
4285 lookupInDeclContext(RD, Result, QualifiedNameLookup,
4293 for (
auto *Cat : IFace->visible_categories()) {
4294 ShadowContextRAII Shadow(
Visited);
4295 lookupInDeclContext(Cat, Result, QualifiedNameLookup,
4300 for (
auto *I : IFace->all_referenced_protocols()) {
4301 ShadowContextRAII Shadow(
Visited);
4302 lookupInDeclContext(I, Result, QualifiedNameLookup,
4307 if (IFace->getSuperClass()) {
4308 ShadowContextRAII Shadow(
Visited);
4309 lookupInDeclContext(IFace->getSuperClass(), Result, QualifiedNameLookup,
4315 if (IFace->getImplementation()) {
4316 ShadowContextRAII Shadow(
Visited);
4317 lookupInDeclContext(IFace->getImplementation(), Result,
4318 QualifiedNameLookup, InBaseClass);
4321 for (
auto *I :
Protocol->protocols()) {
4322 ShadowContextRAII Shadow(
Visited);
4323 lookupInDeclContext(I, Result, QualifiedNameLookup,
4327 for (
auto *I :
Category->protocols()) {
4328 ShadowContextRAII Shadow(
Visited);
4329 lookupInDeclContext(I, Result, QualifiedNameLookup,
4334 if (
Category->getImplementation()) {
4335 ShadowContextRAII Shadow(
Visited);
4336 lookupInDeclContext(
Category->getImplementation(), Result,
4337 QualifiedNameLookup,
true);
4343 UnqualUsingDirectiveSet &UDirs) {
4346 assert(!IncludeDependentBases &&
"Unsupported flag for lookupInScope");
4351 if (!S->getEntity() ||
4352 (!S->getParent() && !
Visited.alreadyVisitedContext(S->getEntity())) ||
4353 (S->getEntity())->isFunctionOrMethod()) {
4354 FindLocalExternScope FindLocals(Result);
4358 for (
Decl *
D : ScopeDecls) {
4360 if ((ND = Result.getAcceptableDecl(ND))) {
4361 Consumer.FoundDecl(ND,
Visited.checkHidden(ND),
nullptr,
false);
4374 for (
DeclContext *Ctx = Entity; Ctx && !Ctx->Equals(OuterCtx);
4375 Ctx = Ctx->getLookupParent()) {
4377 if (
Method->isInstanceMethod()) {
4379 LookupResult IvarResult(Result.getSema(), Result.getLookupName(),
4380 Result.getNameLoc(),
4383 lookupInDeclContext(IFace, IvarResult,
4395 if (Ctx->isFunctionOrMethod())
4398 lookupInDeclContext(Ctx, Result,
false,
4401 }
else if (!S->getParent()) {
4413 lookupInDeclContext(Entity, Result,
false,
4420 for (
const UnqualUsingEntry &UUE : UDirs.getNamespacesFor(Entity))
4421 lookupInDeclContext(
4422 const_cast<DeclContext *
>(UUE.getNominatedNamespace()), Result,
4428 ShadowContextRAII Shadow(
Visited);
4429 lookupInScope(S->getParent(), Result, UDirs);
4435 bool IncludeDependentBases;
4442 bool IncludeGlobalScope,
bool LoadExternal) {
4443 LookupVisibleHelper H(
Consumer,
false,
4445 H.lookupVisibleDecls(*
this, S, Kind, IncludeGlobalScope);
4450 bool IncludeGlobalScope,
4451 bool IncludeDependentBases,
bool LoadExternal) {
4452 LookupVisibleHelper H(
Consumer, IncludeDependentBases, LoadExternal);
4453 H.lookupVisibleDecls(*
this, Ctx, Kind, IncludeGlobalScope);
4458 RedeclarationKind::NotForRedeclaration);
4463 return cast<LabelDecl>(Res);
4471 Scope *S = CurScope;
4473 return cast<LabelDecl>(Res);
4482 assert(S &&
"Not in a function?");
4503 bool EnteringContext,
4504 bool isObjCIvarLookup,
4513 for (; DI != DE; ++DI)
4523 bool AnyVisibleDecls = !NewDecls.empty();
4525 for (; DI != DE; ++DI) {
4527 if (!AnyVisibleDecls) {
4529 AnyVisibleDecls =
true;
4532 NewDecls.push_back(*DI);
4533 }
else if (!AnyVisibleDecls && !(*DI)->isModulePrivate())
4534 NewDecls.push_back(*DI);
4537 if (NewDecls.empty())
4553 Identifiers.clear();
4559 if (
const auto *NS = dyn_cast<NamespaceDecl>(Namespace);
4560 NS && NS->isAnonymousNamespace())
4562 Identifiers.push_back(Namespace->getIdentifier());
4569 case Type::DependentName: {
4570 auto *DT = cast<DependentNameType>(
T);
4572 Identifiers.push_back(DT->getIdentifier());
4575 case Type::TemplateSpecialization: {
4577 cast<TemplateSpecializationType>(
T)->getTemplateName();
4579 Name.getAsQualifiedTemplateName()) {
4581 Name = QTN->getUnderlyingTemplate();
4583 if (
const auto *TD = Name.getAsTemplateDecl(
true))
4584 Identifiers.push_back(TD->getIdentifier());
4587 case Type::DependentTemplateSpecialization: {
4589 cast<DependentTemplateSpecializationType>(
T)
4590 ->getDependentTemplateName();
4596 case Type::SubstTemplateTypeParm:
4597 T = cast<SubstTemplateTypeParmType>(
T)
4598 ->getReplacementType()
4601 case Type::TemplateTypeParm:
4602 Identifiers.push_back(cast<TemplateTypeParmType>(
T)->
getIdentifier());
4604 case Type::Decltype:
4608 case Type::InjectedClassName: {
4609 auto *TT = cast<TagType>(
T);
4611 Identifiers.push_back(TT->getOriginalDecl()->getIdentifier());
4614 case Type::Typedef: {
4615 auto *TT = cast<TypedefType>(
T);
4617 Identifiers.push_back(TT->getDecl()->getIdentifier());
4621 auto *TT = cast<UsingType>(
T);
4623 Identifiers.push_back(TT->getDecl()->getIdentifier());
4626 case Type::UnresolvedUsing: {
4627 auto *TT = cast<UnresolvedUsingType>(
T);
4629 Identifiers.push_back(TT->getDecl()->getIdentifier());
4633 Identifiers.push_back(
QualType(
T, 0).getBaseTypeIdentifier());
4670 addName(Name,
nullptr);
4676 addName(
Keyword,
nullptr, std::nullopt,
true);
4679void TypoCorrectionConsumer::addName(StringRef Name,
NamedDecl *ND,
4683 StringRef TypoStr = Typo->
getName();
4684 unsigned MinED =
abs((
int)Name.size() - (
int)TypoStr.size());
4685 if (MinED && TypoStr.size() / MinED < 3)
4690 unsigned UpperBound = (TypoStr.size() + 2) / 3;
4691 unsigned ED = TypoStr.edit_distance(Name,
true, UpperBound);
4692 if (ED > UpperBound)
return;
4695 if (isKeyword) TC.makeKeyword();
4696 TC.setCorrectionRange(
nullptr, Result.getLookupNameInfo());
4703 StringRef TypoStr = Typo->
getName();
4709 if (TypoStr.size() < 3 &&
4710 (Name != TypoStr || Correction.
getEditDistance(
true) > TypoStr.size()))
4723 if (!CList.empty() && !CList.back().isResolved())
4726 auto RI = llvm::find_if(CList, [NewND](
const TypoCorrection &TypoCorr) {
4729 if (RI != CList.end()) {
4733 auto IsDeprecated = [](
Decl *
D) {
4744 std::pair<bool, std::string> NewKey = {
4748 std::pair<bool, std::string> PrevKey = {
4749 IsDeprecated(RI->getFoundDecl()),
4752 if (NewKey < PrevKey)
4757 if (CList.empty() || Correction.
isResolved())
4758 CList.push_back(Correction);
4761 CorrectionResults.erase(std::prev(CorrectionResults.end()));
4765 const llvm::MapVector<NamespaceDecl *, bool> &KnownNamespaces) {
4766 SearchNamespaces =
true;
4768 for (
auto KNPair : KnownNamespaces)
4769 Namespaces.addNameSpecifier(KNPair.first);
4771 bool SSIsTemplate =
false;
4781 for (
unsigned I = 0; I != Types.size(); ++I) {
4782 const auto *TI = Types[I];
4784 CD = CD->getCanonicalDecl();
4785 if (!CD->isDependentType() && !CD->isAnonymousStructOrUnion() &&
4786 !CD->isUnion() && CD->getIdentifier() &&
4787 (SSIsTemplate || !isa<ClassTemplateSpecializationDecl>(CD)) &&
4788 (CD->isBeingDefined() || CD->isCompleteDefinition()))
4789 Namespaces.addNameSpecifier(CD);
4795 if (++CurrentTCIndex < ValidatedCorrections.size())
4796 return ValidatedCorrections[CurrentTCIndex];
4798 CurrentTCIndex = ValidatedCorrections.size();
4799 while (!CorrectionResults.empty()) {
4800 auto DI = CorrectionResults.begin();
4801 if (DI->second.empty()) {
4802 CorrectionResults.erase(DI);
4806 auto RI = DI->second.begin();
4807 if (RI->second.empty()) {
4808 DI->second.erase(RI);
4809 performQualifiedLookups();
4815 ValidatedCorrections.push_back(TC);
4816 return ValidatedCorrections[CurrentTCIndex];
4819 return ValidatedCorrections[0];
4822bool TypoCorrectionConsumer::resolveCorrection(
TypoCorrection &Candidate) {
4829 CorrectionValidator->IsObjCIvarLookup,
4831 switch (Result.getResultKind()) {
4841 if (TempMemberContext) {
4844 TempMemberContext =
nullptr;
4847 if (SearchNamespaces)
4848 QualifiedResults.push_back(Candidate);
4858 for (
auto *TRD : Result)
4862 if (SearchNamespaces)
4863 QualifiedResults.push_back(Candidate);
4872void TypoCorrectionConsumer::performQualifiedLookups() {
4873 unsigned TypoLen = Typo->
getName().size();
4875 for (
const auto &NSI : Namespaces) {
4877 CXXRecordDecl *NamingClass = NSI.NameSpecifier.getAsRecordDecl();
4884 NamingClass->
getIdentifier() == QR.getCorrectionAsIdentifierInfo())
4888 TC.ClearCorrectionDecls();
4889 TC.setCorrectionSpecifier(NSI.NameSpecifier);
4890 TC.setQualifierDistance(NSI.EditDistance);
4891 TC.setCallbackDistance(0);
4896 unsigned TmpED = TC.getEditDistance(
true);
4897 if (QR.getCorrectionAsIdentifierInfo() != Typo && TmpED &&
4898 TypoLen / TmpED < 3)
4902 Result.setLookupName(QR.getCorrectionAsIdentifierInfo());
4908 switch (Result.getResultKind()) {
4911 if (SS && SS->isValid()) {
4912 std::string NewQualified = TC.getAsString(SemaRef.
getLangOpts());
4913 std::string OldQualified;
4914 llvm::raw_string_ostream OldOStream(OldQualified);
4916 OldOStream << Typo->
getName();
4920 if (OldOStream.str() == NewQualified)
4924 TRD != TRDEnd; ++TRD) {
4928 TC.addCorrectionDecl(*TRD);
4930 if (TC.isResolved()) {
4931 TC.setCorrectionRange(SS.get(), Result.getLookupNameInfo());
4944 QualifiedResults.clear();
4947TypoCorrectionConsumer::NamespaceSpecifierSet::NamespaceSpecifierSet(
4949 : Context(Context), CurContextChain(buildContextChain(CurContext)) {
4951 CurScopeSpec ? CurScopeSpec->
getScopeRep() : std::nullopt) {
4952 llvm::raw_string_ostream SpecifierOStream(CurNameSpecifier);
4960 for (
DeclContext *
C : llvm::reverse(CurContextChain)) {
4961 if (
auto *ND = dyn_cast_or_null<NamespaceDecl>(
C))
4968 DistanceMap[1].push_back(SI);
4971auto TypoCorrectionConsumer::NamespaceSpecifierSet::buildContextChain(
4973 assert(Start &&
"Building a context chain from a null context");
4974 DeclContextList Chain;
4986TypoCorrectionConsumer::NamespaceSpecifierSet::buildNestedNameSpecifier(
4988 unsigned NumSpecifiers = 0;
4990 if (
auto *ND = dyn_cast_or_null<NamespaceDecl>(
C)) {
4993 }
else if (
auto *RD = dyn_cast_or_null<RecordDecl>(
C)) {
5000 return NumSpecifiers;
5003void TypoCorrectionConsumer::NamespaceSpecifierSet::addNameSpecifier(
5006 unsigned NumSpecifiers = 0;
5007 DeclContextList NamespaceDeclChain(buildContextChain(Ctx));
5008 DeclContextList FullNamespaceDeclChain(NamespaceDeclChain);
5011 for (
DeclContext *
C : llvm::reverse(CurContextChain)) {
5012 if (NamespaceDeclChain.empty() || NamespaceDeclChain.back() !=
C)
5014 NamespaceDeclChain.pop_back();
5018 NumSpecifiers = buildNestedNameSpecifier(NamespaceDeclChain, NNS);
5021 if (NamespaceDeclChain.empty()) {
5025 buildNestedNameSpecifier(FullNamespaceDeclChain, NNS);
5027 dyn_cast_or_null<NamedDecl>(NamespaceDeclChain.back())) {
5029 bool SameNameSpecifier =
false;
5030 if (llvm::is_contained(CurNameSpecifierIdentifiers, Name)) {
5031 std::string NewNameSpecifier;
5032 llvm::raw_string_ostream SpecifierOStream(NewNameSpecifier);
5036 SameNameSpecifier = NewNameSpecifier == CurNameSpecifier;
5038 if (SameNameSpecifier || llvm::is_contained(CurContextIdentifiers, Name)) {
5042 buildNestedNameSpecifier(FullNamespaceDeclChain, NNS);
5050 if (NNS && !CurNameSpecifierIdentifiers.empty()) {
5054 llvm::ComputeEditDistance(
llvm::ArrayRef(CurNameSpecifierIdentifiers),
5058 SpecifierInfo SI = {Ctx, NNS, NumSpecifiers};
5059 DistanceMap[NumSpecifiers].push_back(SI);
5068 bool EnteringContext,
5069 bool isObjCIvarLookup,
5075 if (MemberContext) {
5077 if (isObjCIvarLookup) {
5099 false, EnteringContext);
5104 if (
Method->isInstanceMethod() &&
Method->getClassInterface() &&
5109 =
Method->getClassInterface()->lookupInstanceVariable(Name)) {
5121 bool AfterNestedNameSpecifier) {
5122 if (AfterNestedNameSpecifier) {
5135 static const char *
const CTypeSpecs[] = {
5136 "char",
"const",
"double",
"enum",
"float",
"int",
"long",
"short",
5137 "signed",
"struct",
"union",
"unsigned",
"void",
"volatile",
5140 "extern",
"inline",
"static",
"typedef"
5143 for (
const auto *CTS : CTypeSpecs)
5173 static const char *
const CastableTypeSpecs[] = {
5174 "char",
"double",
"float",
"int",
"long",
"short",
5175 "signed",
"unsigned",
"void"
5177 for (
auto *kw : CastableTypeSpecs)
5196 static const char *
const CXXExprs[] = {
5197 "delete",
"new",
"operator",
"throw",
"typeid"
5199 for (
const auto *CE : CXXExprs)
5202 if (isa<CXXMethodDecl>(SemaRef.
CurContext) &&
5203 cast<CXXMethodDecl>(SemaRef.
CurContext)->isInstance())
5222 static const char *
const CStmts[] = {
5223 "do",
"else",
"for",
"goto",
"if",
"return",
"switch",
"while" };
5224 for (
const auto *CS : CStmts)
5232 if (S && S->getBreakParent())
5235 if (S && S->getContinueParent())
5249 if (S && S->isClassScope()) {
5269std::unique_ptr<TypoCorrectionConsumer> Sema::makeTypoCorrectionConsumer(
5307 locs->second.count(TypoName.
getLoc()))
5337 std::unique_ptr<CorrectionCandidateCallback> ClonedCCC = CCC.
clone();
5338 auto Consumer = std::make_unique<TypoCorrectionConsumer>(
5339 *
this, TypoName, LookupKind, S, SS, std::move(ClonedCCC), MemberContext,
5343 bool IsUnqualifiedLookup =
false;
5345 if (MemberContext) {
5350 for (
auto *I : OPT->
quals())
5353 }
else if (SS && SS->
isSet()) {
5360 IsUnqualifiedLookup =
true;
5365 bool SearchNamespaces
5367 (IsUnqualifiedLookup || (SS && SS->
isSet()));
5369 if (IsUnqualifiedLookup || SearchNamespaces) {
5380 std::unique_ptr<IdentifierIterator>
Iter(
External->getIdentifiers());
5382 StringRef Name =
Iter->Next();
5392 *
Consumer->getCorrectionValidator(),
5397 if (SearchNamespaces) {
5401 LoadedExternalKnownNamespaces =
true;
5403 for (
auto *N : ExternalKnownNamespaces)
5404 KnownNamespaces[N] =
true;
5407 Consumer->addNamespaces(KnownNamespaces);
5419 bool EnteringContext,
5421 bool RecordFailure) {
5427 MemberContext, EnteringContext, OPT))
5438 auto Consumer = makeTypoCorrectionConsumer(
5439 TypoName, LookupKind, S, SS, CCC, MemberContext, EnteringContext, OPT,
5447 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure);
5451 unsigned ED =
Consumer->getBestEditDistance(
true);
5452 unsigned TypoLen = Typo->
getName().size();
5453 if (ED > 0 && TypoLen / ED < 3)
5454 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure);
5459 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure);
5463 if (TypoLen >= 3 && ED > 0 && TypoLen / ED < 3) {
5467 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure);
5471 if (!SecondBestTC ||
5477 if (ED == 0 &&
Result.isKeyword())
5478 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure);
5484 }
else if (SecondBestTC && ObjCMessageReceiver) {
5490 BestTC = SecondBestTC;
5491 else if ((*
Consumer)[
"super"].front().isKeyword())
5492 BestTC = (*Consumer)[
"super"].front();
5498 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure);
5507 return FailedCorrection(Typo, TypoName.
getLoc(), RecordFailure && !SecondBestTC);
5514 CorrectionDecls.clear();
5516 CorrectionDecls.push_back(CDecl);
5518 if (!CorrectionName)
5523 if (CorrectionNameSpec) {
5524 std::string tmpBuffer;
5525 llvm::raw_string_ostream PrefixOStream(tmpBuffer);
5527 PrefixOStream << CorrectionName;
5528 return PrefixOStream.str();
5543 bool HasNonType =
false;
5544 bool HasStaticMethod =
false;
5545 bool HasNonStaticMethod =
false;
5546 for (
Decl *
D : candidate) {
5548 D = FTD->getTemplatedDecl();
5551 HasStaticMethod =
true;
5553 HasNonStaticMethod =
true;
5555 if (!isa<TypeDecl>(
D))
5567 bool HasExplicitTemplateArgs,
5569 : NumArgs(NumArgs), HasExplicitTemplateArgs(HasExplicitTemplateArgs),
5570 CurContext(SemaRef.CurContext), MemberFn(ME) {
5573 !HasExplicitTemplateArgs && NumArgs == 1;
5582 for (
auto *
C : candidate) {
5586 FD = FTD->getTemplatedDecl();
5587 if (!HasExplicitTemplateArgs && !FD) {
5588 if (!(FD = dyn_cast<FunctionDecl>(ND)) && isa<ValueDecl>(ND)) {
5592 QualType ValType = cast<ValueDecl>(ND)->getType();
5598 if (FPT->getNumParams() == NumArgs)
5605 : isa<TypeDecl>(ND)) &&
5608 return NumArgs <= 1 || HasExplicitTemplateArgs || isa<CXXRecordDecl>(ND);
5620 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
5621 if (MemberFn || !MD->isStatic()) {
5624 ? dyn_cast_if_present<CXXMethodDecl>(MemberFn->
getMemberDecl())
5625 : dyn_cast_if_present<CXXMethodDecl>(CurContext);
5627 CurMD ? CurMD->
getParent()->getCanonicalDecl() :
nullptr;
5648 if (
const auto *VD = dyn_cast<VarDecl>(
D))
5649 return VD->getDefinition();
5650 if (
const auto *FD = dyn_cast<FunctionDecl>(
D))
5651 return FD->getDefinition();
5652 if (
const auto *TD = dyn_cast<TagDecl>(
D))
5653 return TD->getDefinition();
5654 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(
D))
5655 return ID->getDefinition();
5656 if (
const auto *PD = dyn_cast<ObjCProtocolDecl>(
D))
5657 return PD->getDefinition();
5658 if (
const auto *TD = dyn_cast<TemplateDecl>(
D))
5659 if (
const NamedDecl *TTD = TD->getTemplatedDecl())
5673 assert(Owner &&
"definition of hidden declaration is not in a module");
5676 OwningModules.push_back(Owner);
5678 llvm::append_range(OwningModules, Merged);
5687 llvm::StringRef IncludingFile) {
5688 bool IsAngled =
false;
5690 E, IncludingFile, &IsAngled);
5691 return (IsAngled ?
'<' :
'"') +
Path + (IsAngled ?
'>' :
'"');
5698 assert(!Modules.empty());
5702 if (isa<NamespaceDecl>(
Decl))
5705 auto NotePrevious = [&] {
5709 Diag(DeclLoc, diag::note_unreachable_entity) << (
int)MIK;
5714 llvm::SmallDenseSet<Module*, 8> UniqueModuleSet;
5715 for (
auto *M : Modules) {
5718 if (UniqueModuleSet.insert(M).second)
5719 UniqueModules.push_back(M);
5723 std::string HeaderName;
5734 if (!HeaderName.empty() || UniqueModules.empty()) {
5737 Diag(UseLoc, diag::err_module_unimported_use_header)
5738 << (
int)MIK <<
Decl << !HeaderName.empty() << HeaderName;
5746 Modules = UniqueModules;
5748 auto GetModuleNameForDiagnostic = [
this](
const Module *M) -> std::string {
5764 if (Modules.size() > 1) {
5765 std::string ModuleList;
5767 for (
const auto *M : Modules) {
5768 ModuleList +=
"\n ";
5769 if (++N == 5 && N != Modules.size()) {
5770 ModuleList +=
"[...]";
5773 ModuleList += GetModuleNameForDiagnostic(M);
5776 Diag(UseLoc, diag::err_module_unimported_use_multiple)
5777 << (
int)MIK <<
Decl << ModuleList;
5780 Diag(UseLoc, diag::err_module_unimported_use)
5781 << (
int)MIK <<
Decl << GetModuleNameForDiagnostic(Modules[0]);
5803 assert(
Decl &&
"import required but no declaration to import");
5818 if (
const auto *FD = dyn_cast_if_present<FunctionDecl>(ChosenDecl);
5819 FD && FD->getBuiltinID() &&
5820 PrevNote.
getDiagID() == diag::note_previous_decl &&
5822 ChosenDecl =
nullptr;
5826 Diag(ChosenDecl->getLocation(), PrevNote)
5837 RedeclarationKind::NotForRedeclaration);
5853 if (cast<Decl>(
CurContext)->getOwningModuleForLinkage())
5854 return RedeclarationKind::ForVisibleRedeclaration;
5855 return RedeclarationKind::ForExternalRedeclaration;
Defines the clang::ASTContext interface.
Defines enum values for all the target-independent builtin functions.
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::DenseSet< const void * > Visited
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
static StringRef getIdentifier(const Token &Tok)
Defines the clang::Preprocessor interface.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
static Module * getDefiningModule(Sema &S, Decl *Entity)
Find the module in which the given declaration was defined.
static bool isPreferredLookupResult(Sema &S, Sema::LookupNameKind Kind, const NamedDecl *D, const NamedDecl *Existing)
Determine whether D is a better lookup result than Existing, given that they declare the same entity.
static bool CanDeclareSpecialMemberFunction(const CXXRecordDecl *Class)
Determine whether we can declare a special member function within the class at this point.
static bool canHideTag(const NamedDecl *D)
Determine whether D can hide a tag declaration.
static std::string getHeaderNameForHeader(Preprocessor &PP, FileEntryRef E, llvm::StringRef IncludingFile)
Get a "quoted.h" or <angled.h> include path to use in a diagnostic suggesting the addition of a #incl...
static void addAssociatedClassesAndNamespaces(AssociatedLookup &Result, QualType T)
static QualType getOpenCLTypedefType(Sema &S, llvm::StringRef Name)
Lookup an OpenCL typedef type.
static DeclContext * findOuterContext(Scope *S)
Find the outer declaration context from this scope.
static void LookupPotentialTypoResult(Sema &SemaRef, LookupResult &Res, IdentifierInfo *Name, Scope *S, CXXScopeSpec *SS, DeclContext *MemberContext, bool EnteringContext, bool isObjCIvarLookup, bool FindHidden)
Perform name lookup for a possible result for typo correction.
static void checkCorrectionVisibility(Sema &SemaRef, TypoCorrection &TC)
Check whether the declarations found for a typo correction are visible.
static bool isNamespaceOrTranslationUnitScope(Scope *S)
static bool LookupQualifiedNameInUsingDirectives(Sema &S, LookupResult &R, DeclContext *StartDC)
Perform qualified name lookup in the namespaces nominated by using directives by the given context.
static bool LookupDirect(Sema &S, LookupResult &R, const DeclContext *DC)
static QualType getOpenCLEnumType(Sema &S, llvm::StringRef Name)
Lookup an OpenCL enum type.
static void CollectEnclosingNamespace(Sema::AssociatedNamespaceSet &Namespaces, DeclContext *Ctx)
static bool hasAcceptableDefaultArgument(Sema &S, const ParmDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
static bool isImplicitlyDeclaredMemberFunctionName(DeclarationName Name)
Determine whether this is the name of an implicitly-declared special member function.
static void getNestedNameSpecifierIdentifiers(NestedNameSpecifier NNS, SmallVectorImpl< const IdentifierInfo * > &Identifiers)
static void DeclareImplicitMemberFunctionsWithName(Sema &S, DeclarationName Name, SourceLocation Loc, const DeclContext *DC)
If there are any implicit member functions with the given name that need to be declared in the given ...
static void AddKeywordsToConsumer(Sema &SemaRef, TypoCorrectionConsumer &Consumer, Scope *S, CorrectionCandidateCallback &CCC, bool AfterNestedNameSpecifier)
Add keywords to the consumer as possible typo corrections.
static void GetQualTypesForOpenCLBuiltin(Sema &S, const OpenCLBuiltinStruct &OpenCLBuiltin, unsigned &GenTypeMaxCnt, SmallVector< QualType, 1 > &RetTypes, SmallVector< SmallVector< QualType, 1 >, 5 > &ArgTypes)
Get the QualType instances of the return type and arguments for an OpenCL builtin function signature.
static QualType diagOpenCLBuiltinTypeError(Sema &S, llvm::StringRef TypeClass, llvm::StringRef Name)
Diagnose a missing builtin type.
static bool hasAcceptableMemberSpecialization(Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
static bool hasAcceptableDeclarationImpl(Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Filter F, Sema::AcceptableKind Kind)
static bool isCandidateViable(CorrectionCandidateCallback &CCC, TypoCorrection &Candidate)
static const DeclContext * getContextForScopeMatching(const Decl *D)
Get a representative context for a declaration such that two declarations will have the same context ...
static NamedDecl * findAcceptableDecl(Sema &SemaRef, NamedDecl *D, unsigned IDNS)
Retrieve the visible declaration corresponding to D, if any.
static void GetOpenCLBuiltinFctOverloads(ASTContext &Context, unsigned GenTypeMaxCnt, std::vector< QualType > &FunctionList, SmallVector< QualType, 1 > &RetTypes, SmallVector< SmallVector< QualType, 1 >, 5 > &ArgTypes)
Create a list of the candidate function overloads for an OpenCL builtin function.
static const unsigned MaxTypoDistanceResultSets
static const NamedDecl * getDefinitionToImport(const NamedDecl *D)
Find which declaration we should import to provide the definition of the given declaration.
static bool hasAcceptableExplicitSpecialization(Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
static unsigned getIDNS(Sema::LookupNameKind NameKind, bool CPlusPlus, bool Redeclaration)
static void InsertOCLBuiltinDeclarationsFromTable(Sema &S, LookupResult &LR, IdentifierInfo *II, const unsigned FctIndex, const unsigned Len)
When trying to resolve a function name, if isOpenCLBuiltin() returns a non-null <Index,...
static void LookupPredefedObjCSuperType(Sema &Sema, Scope *S)
Looks up the declaration of "struct objc_super" and saves it for later use in building builtin declar...
static bool CppNamespaceLookup(Sema &S, LookupResult &R, ASTContext &Context, const DeclContext *NS, UnqualUsingDirectiveSet &UDirs)
This file declares semantic analysis functions specific to RISC-V.
__DEVICE__ long long abs(long long __n)
A class for storing results from argument-dependent lookup.
void insert(NamedDecl *D)
Adds a new ADL candidate to this map.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
const SmallVectorImpl< Type * > & getTypes() const
DeclarationNameTable DeclarationNames
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
Builtin::Context & BuiltinInfo
const LangOptions & getLangOpts() const
void setObjCSuperType(QualType ST)
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
const clang::PrintingPolicy & getPrintingPolicy() const
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
CanQualType getCanonicalTypeDeclType(const TypeDecl *TD) const
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
const TargetInfo & getTargetInfo() const
CanQualType getCanonicalTagType(const TagDecl *TD) const
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
bool isPredefinedLibFunction(unsigned ID) const
Determines whether this builtin is a predefined libc/libm function, such as "malloc",...
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
std::list< CXXBasePath >::iterator paths_iterator
std::list< CXXBasePath >::const_iterator const_paths_iterator
void swap(CXXBasePaths &Other)
Swap this data structure's contents with another CXXBasePaths object.
Represents a base class of a C++ class.
QualType getType() const
Retrieves the type of the base class.
Represents a C++ constructor within a class.
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
CXXRecordDecl * getDefinition() const
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
SourceRange getRange() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void * getAsOpaquePtr() const
Retrieve the internal representation of this canonical type.
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
bool WantExpressionKeywords
virtual unsigned RankCandidate(const TypoCorrection &candidate)
Method used by Sema::CorrectTypo to assign an "edit distance" rank to a candidate (where a lower valu...
virtual bool ValidateCandidate(const TypoCorrection &candidate)
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
bool WantFunctionLikeCasts
bool WantRemainingKeywords
virtual std::unique_ptr< CorrectionCandidateCallback > clone()=0
Clone this CorrectionCandidateCallback.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
The results of name lookup within a DeclContext.
DeclListNode::iterator iterator
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 makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
ASTContext & getParentASTContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
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 isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
bool shouldUseQualifiedLookup() const
void setUseQualifiedLookup(bool use=true) const
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isInlineNamespace() const
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
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 ...
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isFunctionOrFunctionTemplate() const
Whether this declaration is a function or function template.
ASTContext & getASTContext() const LLVM_READONLY
bool isInNamedModule() const
Whether this declaration comes from a named module.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
bool isInIdentifierNamespace(unsigned NS) const
bool isInvisibleOutsideTheOwningModule() const
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
SourceLocation getLocation() const
@ IDNS_NonMemberOperator
This declaration is a C++ operator declared in a non-class context.
@ IDNS_TagFriend
This declaration is a friend class.
@ 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_OrdinaryFriend
This declaration is a friend function.
@ IDNS_Using
This declaration is a using declaration.
@ IDNS_LocalExtern
This declaration is a function-local extern declaration of a variable or function.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isDeprecated(std::string *Message=nullptr) const
Determine whether this declaration is marked 'deprecated'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isDefinedOutsideFunctionOrMethod() const
isDefinedOutsideFunctionOrMethod - This predicate returns true if this scoped decl is defined outside...
DeclContext * getDeclContext()
TranslationUnitDecl * getTranslationUnitDecl()
bool hasTagIdentifierNamespace() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
std::string getAsString() const
Retrieve the human-readable string for this name.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
Represents a dependent template name that cannot be resolved prior to template instantiation.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool hasFatalErrorOccurred() const
The return type of classify().
This represents one expression.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool isFPConstrained() const
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Cached information about one file (either on disk or in the virtual file system).
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
bool ValidateCandidate(const TypoCorrection &candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
FunctionCallFilterCCC(Sema &SemaRef, unsigned NumArgs, bool HasExplicitTemplateArgs, MemberExpr *ME=nullptr)
Represents a function declaration or definition.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isDeleted() const
Whether this function has been deleted.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
ExtInfo withCallingConv(CallingConv cc) const
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
Provides lookups to, and iteration over, IdentiferInfo objects.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
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.
iterator - Iterate over the decls of a specified declaration name.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
bool isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IdentifierInfoLookup * getExternalIdentifierLookup() const
Retrieve the external identifier lookup object, if any.
Represents the declaration of a label.
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A class for iterating through a result set and possibly filtering out results.
void restart()
Restart the iteration.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
void addAllDecls(const LookupResult &Other)
Add all the declarations from another set of lookup results.
void setShadowed()
Note that we found and ignored a declaration while performing lookup.
static bool isAvailableForLookup(Sema &SemaRef, NamedDecl *ND)
Determine whether this lookup is permitted to see the declaration.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void setFindLocalExtern(bool FindLocalExtern)
void setAllowHidden(bool AH)
Specify whether hidden declarations are visible, e.g., for recovery reasons.
DeclClass * getAsSingle() const
void setContextRange(SourceRange SR)
Sets a 'context' source range.
static bool isAcceptable(Sema &SemaRef, NamedDecl *D, Sema::AcceptableKind Kind)
void setAmbiguousQualifiedTagHiding()
Make these results show that the name was found in different contexts and a tag decl was hidden by an...
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool isTemplateNameLookup() const
void setAmbiguousBaseSubobjects(CXXBasePaths &P)
Make these results show that the name was found in distinct base classes of the same type.
bool isSingleTagDecl() const
Asks if the result is a single tag decl.
void setLookupName(DeclarationName Name)
Sets the name to look up.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
void setAmbiguousBaseSubobjectTypes(CXXBasePaths &P)
Make these results show that the name was found in base classes of different types.
Filter makeFilter()
Create a filter for this result set.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
void setHideTags(bool Hide)
Sets whether tag declarations should be hidden by non-tag declarations during resolution.
NamedDecl * getAcceptableDecl(NamedDecl *D) const
Retrieve the accepted (re)declaration of the given declaration, if there is one.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
unsigned getIdentifierNamespace() const
Returns the identifier namespace mask for this lookup.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
Sema & getSema() const
Get the Sema object that this lookup result is searching with.
void setNamingClass(CXXRecordDecl *Record)
Sets the 'naming class' for this lookup.
LookupResultKind getResultKind() const
void print(raw_ostream &)
static bool isReachable(Sema &SemaRef, NamedDecl *D)
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
bool isForRedeclaration() const
True if this lookup is just looking for an existing declaration.
DeclarationName getLookupName() const
Gets the name to look up.
void setNotFoundInCurrentInstantiation()
Note that while no result was found in the current instantiation, there were dependent base classes t...
static bool isVisible(Sema &SemaRef, NamedDecl *D)
Determine whether the given declaration is visible to the program.
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
A pointer to member type per C++ 8.3.3 - Pointers to members.
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
virtual bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc)=0
Check global module index for missing imports.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
bool isPrivateModule() const
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
bool isModuleVisible(const Module *M) const
Determine whether the specified module would be visible to a lookup at the end of this module.
bool isModuleInterfaceUnit() const
bool isModuleMapModule() const
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
bool isExplicitGlobalModule() const
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
bool isImplicitGlobalModule() const
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represent a C++ namespace.
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
static constexpr NestedNameSpecifier getGlobal()
NamespaceAndPrefix getAsNamespaceAndPrefix() const
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) const
Print this nested name specifier to the given output stream.
const Type * getAsType() const
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
ObjCCategoryDecl - Represents a category declaration.
Represents an ObjC class declaration.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
Represents one property declaration in an Objective-C interface.
Represents an Objective-C protocol declaration.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
llvm::iterator_range< decls_iterator > decls() const
Represents a parameter to a function.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
unsigned getDiagID() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
bool isMacroDefined(StringRef Id)
HeaderSearch & getHeaderSearchInfo() const
OptionalFileEntryRef getHeaderToIncludeForDiagnostics(SourceLocation IncLoc, SourceLocation MLoc)
We want to produce a diagnostic at location IncLoc concerning an unreachable effect at location MLoc ...
A (possibly-)qualified type.
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
void addVolatile()
Add the volatile type qualifier to this QualType.
Represents a template name as written in source code.
Represents a struct/union/class.
Scope - A scope is a transient data structure that is used while parsing the program.
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
@ DeclScope
This is a scope that can contain a declaration.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
std::unique_ptr< sema::RISCVIntrinsicManager > IntrinsicManager
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
SpecialMemberOverloadResult - The overloading result for a special member function.
Sema - This implements semantic analysis and AST building for C.
void DeclareGlobalNewDelete()
DeclareGlobalNewDelete - Declare the global forms of operator new and delete.
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
CXXConstructorDecl * DeclareImplicitDefaultConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit default constructor for the given class.
llvm::DenseSet< Module * > LookupModulesCache
Cache of additional modules that should be used for name lookup within the current template instantia...
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
llvm::DenseSet< Module * > & getLookupModules()
Get the set of additional modules that should be checked during name lookup.
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupLabel
Label name lookup.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupDestructorName
Look up a name following ~ in a destructor name.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
@ LookupAnyName
Look up any declaration with any name.
bool hasReachableDeclarationSlow(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
MissingImportKind
Kinds of missing import.
void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class)
Force the declaration of any implicitly-declared members of this class.
bool hasVisibleDeclarationSlow(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules)
void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID)
bool LookupInSuper(LookupResult &R, CXXRecordDecl *Class)
Perform qualified name lookup into all base classes of the given class.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
Preprocessor & getPreprocessor() const
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
static NamedDecl * getAsTemplateNameDecl(NamedDecl *D, bool AllowFunctionTemplates=true, bool AllowDependent=true)
Try to interpret the lookup result D as a template-name.
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
bool hasVisibleExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is an explicit specialization declaration for a...
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
IdentifierInfo * getSuperIdentifier() const
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
llvm::DenseMap< NamedDecl *, NamedDecl * > VisibleNamespaceCache
Map from the most recent declaration of a namespace to the most recent visible declaration of that na...
bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def)
IdentifierSourceLocations TypoCorrectionFailures
A cache containing identifiers for which typo correction failed and their locations,...
DiagnosticsEngine & getDiagnostics() const
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
bool hasVisibleDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a visible default argument.
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
ASTContext & getASTContext() const
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
unsigned TyposCorrected
The number of typos corrected by CorrectTypo.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
FPOptions & getCurFPFeatures()
CXXConstructorDecl * LookupDefaultConstructor(CXXRecordDecl *Class)
Look up the default constructor for the given class.
const LangOptions & getLangOpts() const
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
void LookupVisibleDecls(Scope *S, LookupNameKind Kind, VisibleDeclConsumer &Consumer, bool IncludeGlobalScope=true, bool LoadExternal=true)
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
bool hasVisibleMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is a member specialization declaration (as oppo...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
sema::FunctionScopeInfo * getCurFunction() const
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool hasReachableDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a reachable default argument.
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
CXXMethodDecl * LookupMovingAssignment(CXXRecordDecl *Class, unsigned Quals, bool RValueThis, unsigned ThisQuals)
Look up the moving assignment operator for the given class.
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
CXXConstructorDecl * LookupMovingConstructor(CXXRecordDecl *Class, unsigned Quals)
Look up the moving constructor for the given class.
bool isAcceptable(const NamedDecl *D, AcceptableKind Kind)
Determine whether a declaration is acceptable (visible/reachable).
CXXMethodDecl * LookupCopyingAssignment(CXXRecordDecl *Class, unsigned Quals, bool RValueThis, unsigned ThisQuals)
Look up the copying assignment operator for the given class.
bool isModuleVisible(const Module *M, bool ModulePrivate=false)
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
bool hasVisibleMergedDefinition(const NamedDecl *Def)
void DeclareImplicitDeductionGuides(TemplateDecl *Template, SourceLocation Loc)
Declare implicit deduction guides for a class template if we've not already done so.
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
llvm::FoldingSet< SpecialMemberOverloadResultEntry > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation())
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
bool hasReachableMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is a member specialization declaration (as op...
RedeclarationKind forRedeclarationInCurContext() const
CXXConstructorDecl * LookupCopyingConstructor(CXXRecordDecl *Class, unsigned Quals)
Look up the copying constructor for the given class.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void DiagnoseAmbiguousLookup(LookupResult &Result)
Produce a diagnostic describing the ambiguity that resulted from name lookup.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void makeMergedDefinitionVisible(NamedDecl *ND)
Make a merged definition of an existing hidden definition ND visible at the specified location.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool hasReachableExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is an explicit specialization declaration for...
DiagnosticsEngine & Diags
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D, CXXSpecialMemberKind SM, bool ConstArg, bool VolatileArg, bool RValueThis, bool ConstThis, bool VolatileThis)
bool hasAcceptableDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
Determine if the template parameter D has a reachable default argument.
AccessResult CheckMemberAccess(SourceLocation UseLoc, CXXRecordDecl *NamingClass, DeclAccessPair Found)
Checks access to a member.
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
llvm::BumpPtrAllocator BumpAlloc
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested, AcceptableKind Kind, bool OnlyNeedComplete=false)
LiteralOperatorLookupResult
The possible outcomes of name lookup for a literal operator.
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
@ LOLR_Error
The lookup resulted in an error.
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
void ActOnPragmaDump(Scope *S, SourceLocation Loc, IdentifierInfo *II)
Called on #pragma clang __debug dump II.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
IdentifierResolver IdResolver
LabelDecl * LookupExistingLabel(IdentifierInfo *II, SourceLocation IdentLoc)
Perform a name lookup for a label with the specified name; this does not create a new label if the lo...
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
CXXDestructorDecl * DeclareImplicitDestructor(CXXRecordDecl *ClassDecl)
Declare the implicit destructor for the given class.
void createImplicitModuleImportForErrorRecovery(SourceLocation Loc, Module *Mod)
Create an implicit import of the given module at the given source location, for error recovery,...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
void dump() const
Dumps the specified AST fragment and all subtrees to llvm::errs().
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
bool isEntityBeingDefined() const
Determines whether this entity is in the process of being defined.
TagDecl * getOriginalDecl() const
virtual CallingConv getDefaultCallingConv() const
Gets the default calling convention for the given target.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
Location wrapper for a TemplateArgument.
Represents a template argument.
QualType getAsType() const
Retrieve the type for a type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
Represents a type template specialization; the template must be a class template, a type alias templa...
Represents a declaration of a type.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
QualType getCanonicalTypeInternal() const
EnumDecl * castAsEnumDecl() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, bool InBaseClass) override
Invoked each time Sema::LookupVisibleDecls() finds a declaration visible from the current scope or co...
void addKeywordResult(StringRef Keyword)
void addCorrection(TypoCorrection Correction)
const TypoCorrection & getNextCorrection()
Return the next typo correction that passes all internal filters and is deemed valid by the consumer'...
void FoundName(StringRef Name)
void addNamespaces(const llvm::MapVector< NamespaceDecl *, bool > &KnownNamespaces)
Set-up method to add to the consumer the set of namespaces to use in performing corrections to nested...
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
ArrayRef< PartialDiagnostic > getExtraDiagnostics() const
static const unsigned InvalidDistance
void addCorrectionDecl(NamedDecl *CDecl)
Add the given NamedDecl to the list of NamedDecls that are the declarations associated with the Decla...
void setCorrectionDecls(ArrayRef< NamedDecl * > Decls)
Clears the list of NamedDecls and adds the given set.
std::string getAsString(const LangOptions &LO) const
bool requiresImport() const
Returns whether this typo correction is correcting to a declaration that was declared in a module tha...
void setCorrectionRange(CXXScopeSpec *SS, const DeclarationNameInfo &TypoName)
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
void setCallbackDistance(unsigned ED)
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
unsigned getEditDistance(bool Normalized=true) const
Gets the "edit distance" of the typo correction from the typo.
SmallVectorImpl< NamedDecl * >::iterator decl_iterator
void setRequiresImport(bool Req)
std::string getQuoted(const LangOptions &LO) const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
A set of unresolved declarations.
void append(iterator I, iterator E)
void truncate(unsigned N)
The iterator over UnresolvedSets.
Represents C++ using-directive.
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represents a variable declaration or definition.
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
Consumes visible declarations found when searching for all visible names within a given scope or cont...
virtual bool includeHiddenDecls() const
Determine whether hidden declarations (from unimported modules) should be given to this consumer.
virtual ~VisibleDeclConsumer()
Destroys the visible declaration consumer.
bool isVisible(const Module *M) const
Determine whether a module is visible.
SmallVector< SwitchInfo, 8 > SwitchStack
SwitchStack - This is the current set of active switch statements in the block.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
bool Load(InterpState &S, CodePtr OpPC)
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
std::unique_ptr< sema::RISCVIntrinsicManager > CreateRISCVIntrinsicManager(Sema &S)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
@ AmbiguousBaseSubobjects
Name lookup results in an ambiguity because multiple nonstatic entities that meet the lookup criteria...
@ AmbiguousTagHiding
Name lookup results in an ambiguity because an entity with a tag name was hidden by an entity with an...
@ AmbiguousReferenceToPlaceholderVariable
Name lookup results in an ambiguity because multiple placeholder variables were found in the same sco...
@ AmbiguousReference
Name lookup results in an ambiguity because multiple definitions of entity that meet the lookup crite...
@ AmbiguousBaseSubobjectTypes
Name lookup results in an ambiguity because multiple entities that meet the lookup criteria were foun...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
@ Result
The result type of a method or function.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
@ Template
We are parsing a template declaration.
@ Keyword
The name has been typo-corrected to a keyword.
CXXSpecialMemberKind
Kinds of C++ special members.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
@ Success
Template argument deduction was successful.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ EST_None
no exception specification
Represents an element in a path from a derived class to a base class.
int SubobjectNumber
Identifies which base class subobject (of type Base->getType()) this base path element refers to.
const CXXBaseSpecifier * Base
The base specifier that states the link from a derived class to a base class, which will be followed ...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionType::ExtInfo ExtInfo
OverloadExpr * Expression
Describes how types, statements, expressions, and declarations should be printed.