74#include "llvm/ADT/DenseMap.h"
75#include "llvm/ADT/STLExtras.h"
76#include "llvm/ADT/SmallPtrSet.h"
77#include "llvm/Support/TimeProfiler.h"
90 std::optional<tok::TokenKind> ExpectedToken) {
93 std::optional<Token> NextToken =
97 if (ExpectedToken && NextToken->getKind() != *ExpectedToken)
113 StringRef Platform) {
115 if (!SDKInfo && !WarnedDarwinSDKInfoMissing) {
116 Diag(
Loc, diag::warn_missing_sdksettings_for_availability_checking)
118 WarnedDarwinSDKInfoMissing =
true;
124 if (CachedDarwinSDKInfo)
125 return CachedDarwinSDKInfo->get();
129 if (SDKInfo && *SDKInfo) {
130 CachedDarwinSDKInfo = std::make_unique<DarwinSDKInfo>(std::move(**SDKInfo));
131 return CachedDarwinSDKInfo->get();
134 llvm::consumeError(SDKInfo.takeError());
135 CachedDarwinSDKInfo = std::unique_ptr<DarwinSDKInfo>();
141 std::string InventedName;
142 llvm::raw_string_ostream
OS(InventedName);
145 OS <<
"auto:" << Index + 1;
160 Policy.
Bool = BoolMacro->isObjectLike() &&
161 BoolMacro->getNumTokens() == 1 &&
162 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
192 FileID PrevFID)
override {
200 if (llvm::timeTraceProfilerEnabled()) {
202 ProfilerStack.push_back(llvm::timeTraceAsyncProfilerBegin(
203 "Source", FE ? FE->
getName() : StringRef(
"<unknown>")));
206 IncludeStack.push_back(IncludeLoc);
214 if (!IncludeStack.empty()) {
215 if (llvm::timeTraceProfilerEnabled())
216 llvm::timeTraceProfilerEnd(ProfilerStack.pop_back_val());
220 IncludeStack.pop_back_val());
236 StringRef Group = Str.substr(2);
239 Flavor, Group, GroupDiags))
249 case diag::warn_unreachable:
250 case diag::warn_unreachable_break:
251 case diag::warn_unreachable_return:
252 case diag::warn_unreachable_loop_increment:
253 Override.enableCheckUnreachable =
true;
255 case diag::warn_double_lock:
256 Override.enableThreadSafetyAnalysis =
true;
258 case diag::warn_use_in_invalid_state:
259 Override.enableConsumedAnalysis =
true;
275 CurFPFeatures(pp.getLangOpts()), LangOpts(pp.getLangOpts()), PP(pp),
276 Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()),
277 SourceMgr(PP.getSourceManager()), APINotes(SourceMgr, LangOpts),
278 AnalysisWarnings(*this), ThreadSafetyDeclCache(nullptr),
279 LateTemplateParser(nullptr), LateTemplateParserCleanup(nullptr),
280 OpaqueParser(nullptr), CurContext(nullptr),
ExternalSource(nullptr),
281 StackHandler(Diags), CurScope(nullptr), Ident_super(nullptr),
310 MSPointerToMemberRepresentationMethod(
311 LangOpts.getMSPointerToMemberRepresentationMethod()),
312 MSStructPragmaOn(
false), VtorDispStack(LangOpts.getVtorDispMode()),
314 DataSegStack(nullptr), BSSSegStack(nullptr), ConstSegStack(nullptr),
315 CodeSegStack(nullptr), StrictGuardStackCheckStack(
false),
317 VisContext(nullptr), PragmaAttributeCurrentTargetDecl(nullptr),
318 StdCoroutineTraitsCache(nullptr), IdResolver(pp),
319 OriginalLexicalContext(nullptr), StdInitializerList(nullptr),
320 StdTypeIdentity(nullptr),
321 FullyCheckedComparisonCategories(
323 StdSourceLocationImplDecl(nullptr), CXXTypeInfoDecl(nullptr),
324 GlobalNewDeleteDeclared(
false), DisableTypoCorrection(
false),
325 TyposCorrected(0), IsBuildingRecoveryCallExpr(
false), NumSFINAEErrors(0),
326 AccessCheckingSFINAE(
false), CurrentInstantiationScope(nullptr),
327 InNonInstantiationSFINAEContext(
false), NonInstantiationEntries(0),
328 ArgPackSubstIndex(
std::nullopt), SatisfactionCache(Context) {
332 LoadedExternalKnownNamespaces =
false;
353 OpenMP().InitDataSharingAttributesStack();
355 std::unique_ptr<sema::SemaPPCallbacks> Callbacks =
356 std::make_unique<sema::SemaPPCallbacks>();
357 SemaPPCallbackHandler = Callbacks.get();
359 SemaPPCallbackHandler->
set(*
this);
365void Sema::anchor() {}
382 SC->InitializeSema(*
this);
387 ExternalSema->InitializeSema(*
this);
459 if (OCLCompatibleVersion >= 200) {
488 auto AddPointerSizeDependentTypes = [&]() {
492 auto AtomicPtrDiffT =
501 AddPointerSizeDependentTypes();
509 std::vector<QualType> Atomic64BitTypes;
517 Atomic64BitTypes.push_back(AtomicDoubleT);
526 AddPointerSizeDependentTypes();
531#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
532 if (getOpenCLOptions().isSupported(#Ext, getLangOpts())) { \
533 addImplicitTypedef(#ExtType, Context.Id##Ty); \
535#include "clang/Basic/OpenCLExtensionTypes.def"
541#define SVE_TYPE(Name, Id, SingletonId) \
542 addImplicitTypedef(#Name, Context.SingletonId);
543#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
544 addImplicitTypedef( \
545 #Name, Context.getVectorType(Context.BaseType, NumEls, VectorKind));
546#include "clang/Basic/AArch64ACLETypes.def"
550#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
551 addImplicitTypedef(#Name, Context.Id##Ty);
552#include "clang/Basic/PPCTypes.def"
553#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
554 addImplicitTypedef(#Name, Context.Id##Ty);
555#include "clang/Basic/PPCTypes.def"
559#define RVV_TYPE(Name, Id, SingletonId) \
560 addImplicitTypedef(Name, Context.SingletonId);
561#include "clang/Basic/RISCVVTypes.def"
566#define WASM_TYPE(Name, Id, SingletonId) \
567 addImplicitTypedef(Name, Context.SingletonId);
568#include "clang/Basic/WebAssemblyReferenceTypes.def"
574#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
575 addImplicitTypedef(Name, Context.SingletonId);
576#include "clang/Basic/AMDGPUTypes.def"
592 "failed to clean up an InstantiatingTemplate?");
607 ExternalSema->ForgetSema();
610 std::vector<ConstraintSatisfaction *> Satisfactions;
611 Satisfactions.reserve(SatisfactionCache.size());
612 for (
auto &
Node : SatisfactionCache)
613 Satisfactions.push_back(&
Node);
614 for (
auto *
Node : Satisfactions)
620 OpenMP().DestroyDataSharingAttributesStack();
624 SemaPPCallbackHandler->
reset();
628 llvm::function_ref<
void()> Fn) {
633 UnavailableAttr::ImplicitReason reason) {
636 if (!fn)
return false;
647 if (fn->
hasAttr<UnavailableAttr>())
return true;
649 fn->
addAttr(UnavailableAttr::CreateImplicit(
Context,
"", reason, loc));
658 assert(
E &&
"Cannot use with NULL ptr");
665 if (
auto *Ex = dyn_cast<MultiplexExternalSemaSource>(
ExternalSource.get()))
666 Ex->AddSource(std::move(
E));
668 ExternalSource = llvm::makeIntrusiveRefCnt<MultiplexExternalSemaSource>(
673 llvm::errs() <<
"\n*** Semantic Analysis Stats:\n";
683 std::optional<NullabilityKind> ExprNullability = SrcType->
getNullability();
688 std::optional<NullabilityKind> TypeNullability = DstType->
getNullability();
692 Diag(
Loc, diag::warn_nullability_lost) << SrcType << DstType;
700 if (SrcFX != DstFX) {
702 if (Diff.shouldDiagnoseConversion(SrcType, SrcFX, DstType, DstFX))
703 Diag(
Loc, diag::warn_invalid_add_func_effects) << Diff.effectName();
713 if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
719 if (isa<GNUNullExpr>(EStripped))
765 (
"can't implicitly cast glvalue to prvalue with this cast "
770 case CK_LValueToRValue:
771 case CK_ArrayToPointerDecay:
772 case CK_FunctionToPointerDecay:
774 case CK_NonAtomicToAtomic:
775 case CK_HLSLArrayRValue:
776 case CK_HLSLAggregateSplatCast:
781 "can't cast prvalue to glvalue");
787 Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
798 if (Kind == CK_HLSLArrayRValue && !isa<HLSLOutArgExpr>(
E))
805 if (Kind == CK_ArrayToPointerDecay) {
814 E = Materialized.
get();
825 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
826 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
838 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
839 ImpCast->setType(Ty);
840 ImpCast->setValueKind(
VK);
862 llvm_unreachable(
"unknown scalar type kind");
870 if (
D->isExternallyVisible())
877 for (
const auto *Spec :
Template->specializations())
884 if (FD->hasBody(DeclToCheck))
890 if (DeclToCheck != FD)
894 if (
const VarDecl *VD = dyn_cast<VarDecl>(
D)) {
900 if (VD->isReferenced() &&
901 VD->mightBeUsableInConstantExpressions(SemaRef->
Context))
907 for (
const auto *Spec :
Template->specializations())
920 if (DeclToCheck != VD)
928 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
929 return FD->isExternC();
930 return cast<VarDecl>(ND)->isExternC();
955 if (ND->
hasAttr<WeakRefAttr>())
continue;
957 if (isa<CXXDeductionGuideDecl>(ND))
960 if (ND->
hasAttr<DLLImportAttr>() || ND->
hasAttr<DLLExportAttr>()) {
967 if (
const auto *FD = dyn_cast<FunctionDecl>(ND)) {
970 if (FD->isExternallyVisible() &&
972 !FD->getMostRecentDecl()->isInlined() &&
973 !FD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
975 if (FD->getBuiltinID())
978 const auto *VD = cast<VarDecl>(ND);
981 if (VD->isExternallyVisible() &&
983 !VD->getMostRecentDecl()->isInline() &&
984 !VD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
989 if (VD->isKnownToBeDefined())
993 Undefined.push_back(std::make_pair(ND, UndefinedUse.second));
1009 ValueDecl *VD = cast<ValueDecl>(Undef.first);
1023 ? diag::ext_undefined_internal_type
1024 : diag::err_undefined_internal_type)
1025 << isa<VarDecl>(VD) << VD;
1030 bool IsImplicitBase =
false;
1031 if (
const auto *BaseD = dyn_cast<FunctionDecl>(VD)) {
1032 auto *DVAttr = BaseD->
getAttr<OMPDeclareVariantAttr>();
1033 if (DVAttr && !DVAttr->getTraitInfo().isExtensionActive(
1034 llvm::omp::TraitProperty::
1035 implementation_extension_disable_implicit_base)) {
1036 const auto *
Func = cast<FunctionDecl>(
1037 cast<DeclRefExpr>(DVAttr->getVariantFuncRef())->getDecl());
1038 IsImplicitBase = BaseD->isImplicit() &&
1039 Func->getIdentifier()->isMangledOpenMPVariantName();
1044 << isa<VarDecl>(VD) << VD;
1045 }
else if (
auto *FD = dyn_cast<FunctionDecl>(VD)) {
1047 assert(FD->getMostRecentDecl()->isInlined() &&
1048 "used object requires definition but isn't inline or internal?");
1052 assert(cast<VarDecl>(VD)->getMostRecentDecl()->isInline() &&
1053 "used var requires definition but isn't inline or internal?");
1057 S.
Diag(UseLoc, diag::note_used_here);
1067 for (
auto &WeakID : WeakIDs)
1081 RecordCompleteMap::iterator
Cache = MNCComplete.find(RD);
1082 if (
Cache != MNCComplete.end())
1083 return Cache->second;
1091 Complete = M->isDefined() || M->isDefaulted() ||
1092 (M->isPureVirtual() && !isa<CXXDestructorDecl>(M));
1098 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
1099 F->getTemplatedDecl()->isDefined();
1100 else if (
const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) {
1101 if (R->isInjectedClassName())
1103 if (R->hasDefinition())
1124 RecordCompleteMap::iterator
Cache = RecordsComplete.find(RD);
1125 if (
Cache != RecordsComplete.end())
1126 return Cache->second;
1134 if (
CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
1141 dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
1157 if (TD->isReferenced())
1159 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
1160 << isa<TypeAliasDecl>(TD) << TD->getDeclName();
1168 HandleStartOfHeaderUnit();
1175 llvm::TimeTraceScope TimeScope(
"PerformPendingInstantiations");
1212 for (
auto PII : Pending)
1213 if (
auto Func = dyn_cast<FunctionDecl>(PII.first))
1214 Func->setInstantiationIsPending(
true);
1216 Pending.begin(), Pending.end());
1220 llvm::TimeTraceScope TimeScope(
"PerformPendingInstantiations");
1227 "end of TU template instantiation should not create more "
1228 "late-parsed templates");
1233 &&
"reached end of translation unit with a pool attached?");
1246 !ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1266 if (
LangOpts.PCHInstantiateTemplates) {
1267 llvm::TimeTraceScope TimeScope(
"PerformPendingInstantiations");
1291 return ShouldRemoveFromUnused(this, DD);
1305 if (WeakIDs.second.empty())
1310 if (PrevDecl !=
nullptr &&
1311 !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))
1312 for (
const auto &WI : WeakIDs.second)
1313 Diag(WI.getLocation(), diag::warn_attribute_wrong_decl_type)
1316 for (
const auto &WI : WeakIDs.second)
1317 Diag(WI.getLocation(), diag::warn_weak_identifier_undeclared)
1332 if (!ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1334 Diag(ModuleScopes.back().BeginLoc,
1335 diag::err_module_declaration_missing_after_global_module_introducer);
1347 diag::err_module_declaration_missing);
1353 auto DoesModNeedInit = [
this](
Module *M) {
1356 for (
auto [Exported, _] : M->Exports)
1357 if (Exported->isNamedModuleInterfaceHasInit())
1366 CurrentModule->NamedModuleHasInit =
1367 DoesModNeedInit(CurrentModule) ||
1368 llvm::any_of(CurrentModule->submodules(), DoesModNeedInit);
1378 Stack.push_back(CurrentModule);
1379 while (!Stack.empty()) {
1380 Module *Mod = Stack.pop_back_val();
1392 Stack.append(SubmodulesRange.begin(), SubmodulesRange.end());
1404 if (!PendingInlineFuncDecls.empty()) {
1405 for (
auto *
D : PendingInlineFuncDecls) {
1406 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
1407 bool DefInPMF =
false;
1408 if (
auto *FDD = FD->getDefinition()) {
1409 DefInPMF = FDD->getOwningModule()->isPrivateModule();
1413 Diag(FD->getLocation(), diag::err_export_inline_not_defined)
1418 Diag(ModuleScopes.back().BeginLoc,
1419 diag::note_private_module_fragment);
1423 PendingInlineFuncDecls.clear();
1438 for (TentativeDefinitionsType::iterator
1459 diag::err_tentative_def_incomplete_type))
1470 unsigned DiagID = diag::warn_default_init_const_unsafe;
1473 DiagID = diag::warn_default_init_const;
1476 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
1503 for (UnusedFileScopedDeclsType::iterator
1510 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
1512 if (!FD->hasBody(DiagD))
1519 DiagRange.
setEnd(ASTTAL->RAngleLoc);
1521 if (isa<CXXMethodDecl>(DiagD))
1523 << DiagD << DiagRange;
1525 if (FD->getStorageClass() ==
SC_Static &&
1526 !FD->isInlineSpecified() &&
1530 diag::warn_unneeded_static_internal_decl)
1531 << DiagD << DiagRange;
1534 << 0 << DiagD << DiagRange;
1536 }
else if (!FD->isTargetMultiVersion() ||
1537 FD->isTargetMultiVersionDefault()) {
1538 if (FD->getDescribedFunctionTemplate())
1540 << 0 << DiagD << DiagRange;
1543 ? diag::warn_unused_member_function
1544 : diag::warn_unused_function)
1545 << DiagD << DiagRange;
1550 DiagD = cast<VarDecl>(*I);
1552 if (
const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(DiagD)) {
1554 VTSD->getTemplateArgsAsWritten())
1555 DiagRange.
setEnd(ASTTAL->RAngleLoc);
1559 << 1 << DiagD << DiagRange;
1562 << 1 << DiagD << DiagRange;
1568 << DiagD << DiagRange;
1571 << DiagD << DiagRange;
1589 <<
D->getDeclName();
1597 for (
const auto &DeletedFieldInfo :
DeleteExprs) {
1599 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first,
DeleteExprLoc.first,
1614 "Didn't unmark var as having its initializer parsed");
1631 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC) ||
1632 isa<RequiresExprBodyDecl>(DC)) {
1634 }
else if (!AllowLambda && isa<CXXMethodDecl>(DC) &&
1635 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
1636 cast<CXXRecordDecl>(DC->
getParent())->isLambda()) {
1649 return dyn_cast<FunctionDecl>(DC);
1654 while (isa<RecordDecl>(DC))
1656 return dyn_cast<ObjCMethodDecl>(DC);
1661 if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
1662 return cast<NamedDecl>(DC);
1681 if (std::optional<TemplateDeductionInfo *> Info =
isSFINAEContext()) {
1694 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
1695 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1717 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
1718 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1725 Diag(
Loc, diag::warn_cxx98_compat_sfinae_access_control);
1741 (*Info)->addSuppressedDiagnostic(
1746 (*Info)->addSuppressedDiagnostic(
Loc, std::move(PD));
1775 auto *FD = dyn_cast<FunctionDecl>(
CurContext);
1781 for (
auto PDAt :
Loc->second) {
1783 PDAt.second.getDiagID()))
1798 S.
Diags.
Report(FnIt->second.Loc, diag::note_called_by));
1799 Builder << FnIt->second.FD;
1833class DeferredDiagnosticsEmitter
1851 bool ShouldEmitRootNode;
1856 unsigned InOMPDeviceContext;
1858 DeferredDiagnosticsEmitter(
Sema &S)
1859 : Inherited(S), ShouldEmitRootNode(
false), InOMPDeviceContext(0) {}
1861 bool shouldVisitDiscardedStmt()
const {
return false; }
1864 ++InOMPDeviceContext;
1865 Inherited::VisitOMPTargetDirective(
Node);
1866 --InOMPDeviceContext;
1870 if (isa<VarDecl>(
D))
1872 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
1875 Inherited::visitUsedDecl(
Loc,
D);
1887 (ClassDecl->isBeingDefined() || ClassDecl->isCompleteDefinition()))
1889 asImpl().visitUsedDecl(MemberDtor->getLocation(), MemberDtor);
1897 (BaseDecl->isBeingDefined() || BaseDecl->isCompleteDefinition()))
1899 asImpl().visitUsedDecl(BaseDtor->getLocation(), BaseDtor);
1905 for (
auto *
D : DS->
decls())
1906 if (
auto *VD = dyn_cast<VarDecl>(
D))
1907 if (VD->isThisDeclarationADefinition() &&
1908 VD->needsDestruction(S.
Context)) {
1911 ClassDecl && (ClassDecl->isBeingDefined() ||
1912 ClassDecl->isCompleteDefinition()))
1914 asImpl().visitUsedDecl(Dtor->getLocation(), Dtor);
1917 Inherited::VisitDeclStmt(DS);
1921 "Should only check file-scope variables");
1923 auto DevTy = OMPDeclareTargetDeclAttr::getDeviceType(VD);
1924 bool IsDev = DevTy && (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost ||
1925 *DevTy == OMPDeclareTargetDeclAttr::DT_Any);
1927 ++InOMPDeviceContext;
1930 --InOMPDeviceContext;
1935 auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];
1936 FunctionDecl *Caller = UsePath.empty() ? nullptr : UsePath.back();
1937 if ((!ShouldEmitRootNode && !S.
getLangOpts().OpenMP && !Caller) ||
1941 if (Caller && S.
LangOpts.OpenMP && UsePath.size() == 1 &&
1942 (ShouldEmitRootNode || InOMPDeviceContext))
1949 if (ShouldEmitRootNode || InOMPDeviceContext)
1950 emitDeferredDiags(FD, Caller);
1953 if (!Done.insert(FD).second)
1955 InUsePath.insert(FD);
1956 UsePath.push_back(FD);
1957 if (
auto *S = FD->
getBody()) {
1961 asImpl().VisitCalledDestructors(Dtor);
1963 InUsePath.erase(FD);
1966 void checkRecordedDecl(
Decl *
D) {
1967 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
1969 Sema::FunctionEmissionStatus::Emitted;
1972 checkVar(cast<VarDecl>(
D));
1976 void emitDeferredDiags(
FunctionDecl *FD,
bool ShowCallStack) {
1980 bool HasWarningOrError =
false;
1981 bool FirstDiag =
true;
1988 HasWarningOrError |=
1997 if (FirstDiag && HasWarningOrError && ShowCallStack) {
2015 DeferredDiagnosticsEmitter DDE(*
this);
2017 DDE.checkRecordedDecl(
D);
2048 : S(S),
Loc(
Loc), DiagID(DiagID), Fn(Fn),
2049 ShowCallStack(K == K_ImmediateWithCallStack || K == K_Deferred) {
2054 case K_ImmediateWithCallStack:
2055 ImmediateDiag.emplace(
2059 assert(Fn &&
"Must have a function to attach the deferred diag to.");
2061 PartialDiagId.emplace(
Diags.size());
2067Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(SemaDiagnosticBuilder &&
D)
2069 ShowCallStack(
D.ShowCallStack), ImmediateDiag(
D.ImmediateDiag),
2070 PartialDiagId(
D.PartialDiagId) {
2072 D.ShowCallStack =
false;
2073 D.ImmediateDiag.reset();
2074 D.PartialDiagId.reset();
2077Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
2078 if (ImmediateDiag) {
2081 ImmediateDiag.reset();
2083 if (ShowCallStack) {
2086 if (IsWarningOrError)
2090 assert((!PartialDiagId || ShowCallStack) &&
2091 "Must always show call stack for deferred diags.");
2097 FD = FD ? FD : getCurFunctionDecl();
2098 if (LangOpts.OpenMP)
2099 return LangOpts.OpenMPIsTargetDevice
2100 ? OpenMP().diagIfOpenMPDeviceCode(
Loc, DiagID, FD)
2101 : OpenMP().diagIfOpenMPHostCode(
Loc, DiagID, FD);
2104 :
CUDA().DiagIfHostCode(
Loc, DiagID);
2107 return SYCL().DiagIfDeviceCode(
Loc, DiagID);
2114 if (isUnevaluatedContext() || Ty.
isNull())
2121 if (
D && LangOpts.SYCLIsDevice) {
2122 llvm::DenseSet<QualType>
Visited;
2126 Decl *
C = cast<Decl>(getCurLexicalContext());
2130 if (
const auto *MD = dyn_cast<CXXMethodDecl>(
C)) {
2131 if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&
2135 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD))
2136 if (Ctor->isCopyOrMoveConstructor() && Ctor->isTrivial())
2143 ? cast<FunctionDecl>(
C)
2144 : dyn_cast_or_null<FunctionDecl>(
D);
2146 auto CheckDeviceType = [&](
QualType Ty) {
2157 targetDiag(
Loc, PD, FD)
2158 <<
false << 0 <<
false
2166 bool LongDoubleMismatched =
false;
2169 if ((&Sem != &llvm::APFloat::PPCDoubleDouble() &&
2171 (&Sem == &llvm::APFloat::PPCDoubleDouble() &&
2173 LongDoubleMismatched =
true;
2182 !LangOpts.CUDAIsDevice) ||
2183 LongDoubleMismatched) {
2190 if (targetDiag(
Loc, PD, FD)
2192 <<
static_cast<unsigned>(Context.
getTypeSize(Ty)) << Ty
2198 targetDiag(
D->
getLocation(), diag::note_defined_here, FD) <<
D;
2202 auto CheckType = [&](
QualType Ty,
bool IsRetTy =
false) {
2203 if (LangOpts.SYCLIsDevice ||
2204 (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice) ||
2205 LangOpts.CUDAIsDevice)
2206 CheckDeviceType(Ty);
2218 <<
false << 0 << Ty <<
false
2224 targetDiag(
D->
getLocation(), diag::note_defined_here, FD) <<
D;
2227 bool IsDouble = UnqualTy == Context.
DoubleTy;
2228 bool IsFloat = UnqualTy == Context.
FloatTy;
2229 if (IsRetTy && !TI.
hasFPReturn() && (IsDouble || IsFloat)) {
2237 <<
false << 0 << Ty <<
true
2243 targetDiag(
D->
getLocation(), diag::note_defined_here, FD) <<
D;
2247 llvm::StringMap<bool> CallerFeatureMap;
2249 RISCV().checkRVVTypeSupport(Ty,
Loc,
D, CallerFeatureMap);
2254 llvm::StringMap<bool> CallerFeatureMap;
2258 Diag(
Loc, diag::err_sve_vector_in_non_sve_target) << Ty;
2261 Diag(
Loc, diag::err_sve_vector_in_non_streaming_function) << Ty;
2269 (LangOpts.VScaleMin != LangOpts.VScaleStreamingMin ||
2270 LangOpts.VScaleMax != LangOpts.VScaleStreamingMax)) {
2272 Diag(
Loc, diag::err_sve_fixed_vector_in_streaming_function)
2275 if (FTy->getAArch64SMEAttributes() &
2277 Diag(
Loc, diag::err_sve_fixed_vector_in_streaming_function)
2285 if (
const auto *FPTy = dyn_cast<FunctionProtoType>(Ty)) {
2286 for (
const auto &ParamTy : FPTy->param_types())
2288 CheckType(FPTy->getReturnType(),
true);
2290 if (
const auto *FNPTy = dyn_cast<FunctionNoProtoType>(Ty))
2291 CheckType(FNPTy->getReturnType(),
true);
2300 loc = getSourceManager().getExpansionLoc(loc);
2304 if (getPreprocessor().getSpelling(loc, buffer) == name) {
2316 Ctx = Ctx->getPrimaryContext();
2317 for (
Scope *S = getCurScope(); S; S = S->getParent()) {
2322 if (Ctx == Entity->getPrimaryContext())
2331 if (FunctionScopes.empty() && CachedFunctionScope) {
2333 CachedFunctionScope->Clear();
2334 FunctionScopes.push_back(CachedFunctionScope.release());
2338 if (LangOpts.OpenMP)
2339 OpenMP().pushOpenMPFunctionRegion();
2344 BlockScope,
Block));
2345 CapturingFunctionScopes++;
2350 FunctionScopes.push_back(LSI);
2351 CapturingFunctionScopes++;
2357 LSI->AutoTemplateParameterDepth = Depth;
2361 "Remove assertion if intentionally called in a non-lambda context.");
2388 if (!
Result.isInvalid()) {
2408 VarDecl *VD = BC.getVariable();
2409 if (VD->
hasAttr<BlocksAttr>()) {
2418 QualType CapType = BC.getVariable()->getType();
2444 assert(!FunctionScopes.empty() &&
"mismatched push/pop!");
2451 if (LangOpts.OpenMP)
2452 OpenMP().popOpenMPFunctionRegion(
Scope.get());
2457 AnalysisWarnings.IssueWarnings(*WP,
Scope.get(),
D, BlockType);
2459 for (
const auto &PUD :
Scope->PossiblyUnreachableDiags)
2460 Diag(PUD.Loc, PUD.PD);
2467 if (!
Scope->isPlainFunction())
2468 Self->CapturingFunctionScopes--;
2470 if (
Scope->isPlainFunction() && !
Self->CachedFunctionScope)
2477 getCurFunction()->CompoundScopes.push_back(
2483 assert(!CurFunction->
CompoundScopes.empty() &&
"mismatched push/pop");
2489 return getCurFunction()->hasUnrecoverableErrorOccurred();
2493 if (!FunctionScopes.empty())
2494 FunctionScopes.back()->setHasBranchIntoScope();
2498 if (!FunctionScopes.empty())
2499 FunctionScopes.back()->setHasBranchProtectedScope();
2503 if (!FunctionScopes.empty())
2504 FunctionScopes.back()->setHasIndirectGoto();
2508 if (!FunctionScopes.empty())
2509 FunctionScopes.back()->setHasMustTail();
2513 if (FunctionScopes.empty())
2516 auto CurBSI = dyn_cast<BlockScopeInfo>(FunctionScopes.back());
2517 if (CurBSI && CurBSI->TheDecl &&
2518 !CurBSI->TheDecl->Encloses(CurContext)) {
2520 assert(!CodeSynthesisContexts.empty());
2528 if (FunctionScopes.empty())
2531 for (
int e = FunctionScopes.size() - 1; e >= 0; --e) {
2532 if (isa<sema::BlockScopeInfo>(FunctionScopes[e]))
2534 return FunctionScopes[e];
2540 for (
auto *
Scope : llvm::reverse(FunctionScopes)) {
2541 if (
auto *CSI = dyn_cast<CapturingScopeInfo>(
Scope)) {
2542 auto *LSI = dyn_cast<LambdaScopeInfo>(CSI);
2543 if (LSI && LSI->Lambda && !LSI->Lambda->Encloses(CurContext) &&
2544 LSI->AfterParameterList) {
2548 assert(!CodeSynthesisContexts.empty());
2558 if (FunctionScopes.empty())
2561 auto I = FunctionScopes.rbegin();
2562 if (IgnoreNonLambdaCapturingScope) {
2563 auto E = FunctionScopes.rend();
2564 while (I !=
E && isa<CapturingScopeInfo>(*I) && !isa<LambdaScopeInfo>(*I))
2569 auto *CurLSI = dyn_cast<LambdaScopeInfo>(*I);
2570 if (CurLSI && CurLSI->Lambda && CurLSI->CallOperator &&
2571 !CurLSI->Lambda->Encloses(CurContext) && CurLSI->AfterParameterList) {
2573 assert(!CodeSynthesisContexts.empty());
2584 return (LSI->TemplateParams.size() ||
2585 LSI->GLTemplateParameterList) ? LSI :
nullptr;
2592 if (!LangOpts.RetainCommentsFromSystemHeaders &&
2593 SourceMgr.isInSystemHeader(Comment.
getBegin()))
2599 StringRef MagicMarkerText;
2602 MagicMarkerText =
"///<";
2605 MagicMarkerText =
"/**<";
2610 Diag(Comment.
getBegin(), diag::warn_splice_in_doxygen_comment);
2613 llvm_unreachable(
"if this is an almost Doxygen comment, "
2614 "it should be ordinary");
2616 Diag(Comment.
getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
2624char ExternalSemaSource::ID;
2634 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {}
2645 bool IsMemExpr =
false;
2655 Overloads = dyn_cast<UnresolvedMemberExpr>(
E.
IgnoreParens());
2664 DeclsEnd = Overloads->
decls_end(); it != DeclsEnd; ++it) {
2672 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
2673 if (OverloadDecl->getMinRequiredArguments() == 0) {
2675 (!IsMV || !(OverloadDecl->isCPUDispatchMultiVersion() ||
2676 OverloadDecl->isCPUSpecificMultiVersion()))) {
2680 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
2681 IsMV = OverloadDecl->isCPUDispatchMultiVersion() ||
2682 OverloadDecl->isCPUSpecificMultiVersion();
2690 return !ZeroArgCallReturnTy.
isNull();
2707 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(
E.
IgnoreParens())) {
2708 if (
const auto *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
2709 if (Fun->getMinRequiredArguments() == 0)
2710 ZeroArgCallReturnTy = Fun->getReturnType();
2725 if (
const auto *FPT = dyn_cast_if_present<FunctionProtoType>(FunTy)) {
2726 if (FPT->getNumParams() == 0)
2747 unsigned ShownOverloads = 0;
2748 unsigned SuppressedOverloads = 0;
2750 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
2752 ++SuppressedOverloads;
2756 const NamedDecl *Fn = (*It)->getUnderlyingDecl();
2758 if (
const auto *FD = Fn->getAsFunction()) {
2760 !FD->
getAttr<TargetAttr>()->isDefaultVersion())
2763 !FD->
getAttr<TargetVersionAttr>()->isDefaultVersion())
2766 S.
Diag(Fn->getLocation(), diag::note_possible_target_of_call);
2772 if (SuppressedOverloads)
2773 S.
Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
2774 << SuppressedOverloads;
2779 bool (*IsPlausibleResult)(
QualType)) {
2780 if (!IsPlausibleResult)
2785 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
2786 const auto *OverloadDecl = cast<FunctionDecl>(*It);
2787 QualType OverloadResultTy = OverloadDecl->getReturnType();
2788 if (IsPlausibleResult(OverloadResultTy))
2789 PlausibleOverloads.
addDecl(It.getDecl());
2800 return (!isa<CStyleCastExpr>(
E) &&
2801 !isa<UnaryOperator>(
E) &&
2802 !isa<BinaryOperator>(
E) &&
2803 !isa<CXXOperatorCallExpr>(
E));
2807 if (
const auto *UO = dyn_cast<UnaryOperator>(
E))
2808 E = UO->getSubExpr();
2810 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(
E)) {
2811 if (ULE->getNumDecls() == 0)
2814 const NamedDecl *ND = *ULE->decls_begin();
2815 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
2823 bool (*IsPlausibleResult)(
QualType)) {
2830 if (!isSFINAEContext()) {
2832 if (tryExprAsCall(*
E.get(), ZeroArgCallTy, Overloads) &&
2833 !ZeroArgCallTy.
isNull() &&
2834 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
2856 if (!ForceComplain)
return false;
2868 Ident_super = &Context.
Idents.
get(
"super");
2874 unsigned OpenMPCaptureLevel) {
2878 ? OpenMP().getOpenMPNestingLevel()
2880 OpenMPCaptureLevel);
2881 CSI->ReturnType = Context.
VoidTy;
2882 FunctionScopes.push_back(CSI);
2883 CapturingFunctionScopes++;
2887 if (FunctionScopes.empty())
2890 return dyn_cast<CapturedRegionScopeInfo>(FunctionScopes.back());
2893const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
2899 : S(S), OldFPFeaturesState(S.CurFPFeatures),
2900 OldOverrides(S.FpPragmaStack.CurrentValue),
2901 OldEvalMethod(S.PP.getCurrentFPEvalMethod()),
2902 OldFPPragmaLocation(S.PP.getLastFPEvalPragmaLocation()) {}
2911 assert(
D.getCXXScopeSpec().isSet() &&
2912 "can only be called for qualified names");
2917 !
D.getDeclSpec().isFriendSpecified());
2922 bool Result = llvm::all_of(LR, [](
Decl *Dcl) {
2923 if (
NamedDecl *ND = dyn_cast<NamedDecl>(Dcl)) {
2924 ND = ND->getUnderlyingDecl();
2925 return isa<FunctionDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
2936 auto *A = AnnotateAttr::Create(
Context, Annot, Args.data(), Args.size(), CI);
2953 for (
unsigned Idx = 1; Idx < AL.
getNumArgs(); Idx++) {
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::DenseSet< const void * > Visited
llvm::MachO::FileType FileType
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis functions specific to AVR.
This file declares semantic analysis functions specific to BPF.
This file declares semantic analysis for CUDA constructs.
This file declares facilities that support code completion.
This file declares semantic analysis for DirectX constructs.
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis functions specific to Hexagon.
This file declares semantic analysis functions specific to LoongArch.
This file declares semantic analysis functions specific to M68k.
This file declares semantic analysis functions specific to MIPS.
This file declares semantic analysis functions specific to MSP430.
This file declares semantic analysis functions specific to NVPTX.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis routines for OpenCL.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis for expressions involving.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SPIRV constructs.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to SystemZ.
This file declares semantic analysis functions specific to Wasm.
This file declares semantic analysis functions specific to X86.
static void checkEscapingByref(VarDecl *VD, Sema &S)
static bool IsCPUDispatchCPUSpecificMultiVersion(const Expr *E)
llvm::DenseMap< const CXXRecordDecl *, bool > RecordCompleteMap
static bool IsCallableWithAppend(const Expr *E)
Determine whether the given expression can be called by just putting parentheses after it.
static bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD, RecordCompleteMap &MNCComplete)
Returns true, if all methods and nested classes of the given CXXRecordDecl are defined in this transl...
static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads, const SourceLocation FinalNoteLoc)
Give notes for a set of overloads.
static bool isFunctionOrVarDeclExternC(const NamedDecl *ND)
static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S)
static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D)
Used to prune the decls of Sema's UnusedFileScopedDecls vector.
static void emitCallStackNotes(Sema &S, const FunctionDecl *FD)
static void notePlausibleOverloads(Sema &S, SourceLocation Loc, const UnresolvedSetImpl &Overloads, bool(*IsPlausibleResult)(QualType))
static void checkUndefinedButUsed(Sema &S)
checkUndefinedButUsed - Check for undefined objects with internal linkage or that are inline.
static bool IsRecordFullyDefined(const CXXRecordDecl *RD, RecordCompleteMap &RecordsComplete, RecordCompleteMap &MNCComplete)
Returns true, if the given CXXRecordDecl is fully defined in this translation unit,...
Defines the SourceManager interface.
Allows QualTypes to be sorted and hence used in maps and sets.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual void CompleteTentativeDefinition(VarDecl *D)
CompleteTentativeDefinition - Callback invoked at the end of a translation unit to notify the consume...
virtual ASTMutationListener * GetASTMutationListener()
If the consumer is interested in entities getting modified after their initial creation,...
virtual void CompleteExternalDeclaration(DeclaratorDecl *D)
CompleteExternalDeclaration - Callback invoked at the end of a translation unit to notify the consume...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefDecl * getCFConstantStringDecl() const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
void addComment(const RawComment &RC)
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
PartialDiagnostic::DiagStorageAllocator & getDiagAllocator()
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
const TargetInfo * getAuxTargetInfo() const
CanQualType UnsignedLongTy
bool hasAnyFunctionEffects() const
CanQualType BoundMemberTy
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
CanQualType OCLClkEventTy
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
const clang::PrintingPolicy & getPrintingPolicy() const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
CanQualType UnsignedIntTy
TagDecl * getMSTypeInfoTagDecl() const
Retrieve the implicitly-predeclared 'struct type_info' declaration.
CanQualType OCLReserveIDTy
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
QualType getIntPtrType() const
Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.
IdentifierInfo * getBoolName() const
Retrieve the identifier 'bool'.
void setPrintingPolicy(const clang::PrintingPolicy &Policy)
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Attr - This represents one attribute.
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
ArrayRef< Capture > captures() const
SourceLocation getCaretLocation() const
bool doesNotEscape() const
Represents a C++ destructor within a class.
CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of C++ classes.
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
An iterator over the friend declarations of a class.
Represents a C++ struct/union/class.
friend_iterator friend_begin() const
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
friend_iterator friend_end() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
const char * getCastKindName() const
Abstract interface for a consumer of code-completion information.
The information about the darwin SDK that was used during this compilation.
decl_iterator - Iterates through the declarations stored within this context.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
decl_iterator decls_end() const
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
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 ...
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isReferenced() const
Whether any declaration of this entity was referenced.
bool isInvalidDecl() const
SourceLocation getLocation() const
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Information about one declarator, including the parsed type information and the identifier.
A little helper class used to produce diagnostics.
static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID)
Determines whether the given built-in diagnostic ID is for an error that is suppressed if it occurs d...
@ SFINAE_SubstitutionFailure
The diagnostic should not be reported, but it should cause template argument deduction to fail.
@ SFINAE_Suppress
The diagnostic should be suppressed entirely.
@ SFINAE_AccessControl
The diagnostic is an access-control diagnostic, which will be substitution failures in some contexts ...
@ SFINAE_Report
The diagnostic should be reported.
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
const SourceLocation & getLocation() const
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void SetArgToStringFn(ArgToStringFnTy Fn, void *Cookie)
bool EmitDiagnostic(const DiagnosticBuilder &DB, bool Force=false)
Emit the diagnostic.
bool hasErrorOccurred() const
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
void setLastDiagnosticIgnored(bool IsIgnored)
Pretend that the last diagnostic issued was ignored, so any subsequent notes will be suppressed,...
Level
The level of the diagnostic, after it has been through mapping.
bool hasFatalErrorOccurred() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
RAII object that enters a new expression evaluation context.
This represents one expression.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
An abstract interface that should be implemented by external AST sources that also provide informatio...
virtual void updateOutOfDateSelector(Selector Sel)
Load the contents of the global method pool for a given selector if necessary.
virtual void ReadMethodPool(Selector Sel)
Load the contents of the global method pool for a given selector.
virtual void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined)
Load the set of used but not defined functions or variables with internal linkage,...
~ExternalSemaSource() override
virtual void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces)
Load the set of namespaces that are known to the external source, which will be used during typo corr...
virtual void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &)
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
llvm::vfs::FileSystem & getVirtualFileSystem() const
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.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isDeleted() const
Whether this function has been deleted.
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
@ SME_PStateSMCompatibleMask
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents a C array with an unspecified size.
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
@ CMK_HeaderUnit
Compiling a module header unit.
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i....
CommentOptions CommentOpts
Options for parsing comments.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
void erase(iterator From, iterator To)
iterator begin(Source *source, bool LocalOnly=false)
static std::optional< Token > findNextToken(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeComments=false)
Finds the token that comes right after the given location.
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset, const SourceManager &SM, const LangOptions &LangOpts)
Computes the source location just past the end of the token at this source location.
Represents the results of name lookup.
Encapsulates the data about a macro definition (e.g.
Abstract interface for a module loader.
bool resolveExports(Module *Mod, bool Complain)
Resolve all of the unresolved exports in the given module.
bool resolveConflicts(Module *Mod, bool Complain)
Resolve all of the unresolved conflicts in the given module.
bool resolveUses(Module *Mod, bool Complain)
Resolve all of the unresolved uses in the given module.
Describes a module or submodule.
bool isNamedModuleInterfaceHasInit() const
bool isInterfaceOrPartition() const
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
llvm::iterator_range< submodule_iterator > submodules()
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
static const unsigned NumNSNumberLiteralMethods
This represents a decl that may have a name.
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
bool isExternallyVisible() const
This represents '#pragma omp target' directive.
ObjCMethodDecl - Represents an instance or class method declaration.
void addSupport(const llvm::StringMap< bool > &FeaturesMap, const LangOptions &Opts)
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.
decls_iterator decls_begin() const
decls_iterator decls_end() const
This interface provides a way to observe the actions of the preprocessor as it does its thing.
ParsedAttr - Represents a syntactic attribute.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool isArgIdent(unsigned Arg) const
Expr * getArgAsExpr(unsigned Arg) const
unsigned getDiagID() const
void Emit(const DiagnosticBuilder &DB) const
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
bool isIncrementalProcessingEnabled() const
Returns true if incremental processing is enabled.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
LangOptions::FPEvalMethodKind getCurrentFPEvalMethod() const
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
void setCurrentFPEvalMethod(SourceLocation PragmaLoc, LangOptions::FPEvalMethodKind Val)
FileManager & getFileManager() const
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
HeaderSearch & getHeaderSearchInfo() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
A (possibly-)qualified type.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isConstQualified() const
Determine whether this type is const-qualified.
Represents a struct/union/class.
field_range fields() const
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
Scope - A scope is a transient data structure that is used while parsing the program.
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
@ DeclScope
This is a scope that can contain a declaration.
Smart pointer class that efficiently represents Objective-C method names.
A generic diagnostic builder for errors which may or may not be deferred.
@ K_Immediate
Emit the diagnostic immediately (i.e., behave like Sema::Diag()).
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
llvm::DenseMap< CanonicalDeclPtr< const FunctionDecl >, FunctionDeclAndLoc > DeviceKnownEmittedFns
An inverse call graph, mapping known-emitted functions to one of their known-emitted callers (plus th...
An abstract interface that should be implemented by clients that read ASTs and then require further s...
void ActOnEndOfTranslationUnit(TranslationUnitDecl *TU)
ObjCMethodDecl * NSNumberLiteralMethods[NSAPI::NumNSNumberLiteralMethods]
The Objective-C NSNumber methods used to create NSNumber literals.
void DiagnoseUseOfUnimplementedSelectors()
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void DiagnoseUnterminatedOpenMPDeclareTarget()
Report unterminated 'omp declare target' or 'omp begin declare target' at the end of a compilation un...
void finalizeOpenMPDelayedAnalysis(const FunctionDecl *Caller, const FunctionDecl *Callee, SourceLocation Loc)
Finishes analysis of the deferred functions calls that may be declared as host/nohost during device/h...
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
FPFeaturesStateRAII(Sema &S)
Custom deleter to allow FunctionScopeInfos to be kept alive for a short time after they've been poppe...
void operator()(sema::FunctionScopeInfo *Scope) const
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Sema - This implements semantic analysis and AST building for C.
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
void addImplicitTypedef(StringRef Name, QualType T)
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
void emitAndClearUnusedLocalTypedefWarnings()
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
void Initialize()
Perform initialization that occurs after the parser has been initialized but before it parses anythin...
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
llvm::DenseSet< std::pair< Decl *, unsigned > > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
PragmaStack< FPOptionsOverride > FpPragmaStack
void setFunctionHasBranchIntoScope()
void ActOnComment(SourceRange Comment)
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
FPOptionsOverride CurFPFeatureOverrides()
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
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
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
void DiagnosePrecisionLossInComplexDivision()
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
DiagnosticsEngine & getDiagnostics() const
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags
Diagnostics that are emitted only if we discover that the given function must be codegen'ed.
void CheckDelayedMemberExceptionSpecs()
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
ASTContext & getASTContext() const
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
unsigned NumSFINAEErrors
The number of SFINAE diagnostics that have been trapped.
void setFunctionHasIndirectGoto()
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
void PushFunctionScope()
Enter a new function scope.
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
sema::LambdaScopeInfo * PushLambdaScope()
const LangOptions & getLangOpts() const
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
ASTConsumer & getASTConsumer() const
threadSafety::BeforeSet * ThreadSafetyDeclCache
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
const LangOptions & LangOpts
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
static const uint64_t MaximumAlignment
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
void PushCompoundScope(bool IsStmtExpr)
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
static bool isCast(CheckedConversionKind CCK)
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
void diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn when implicitly changing function effects.
void PerformPendingInstantiations(bool LocalOnly=false, bool AtEndOfTU=true)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
ExprResult PerformMoveOrCopyInitialization(const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value, bool SupressSimplerImplicitMoves=false)
Perform the initialization of a potentially-movable value, which is the result of return value.
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
CanThrowResult canThrow(const Stmt *E)
bool AccessCheckingSFINAE
When true, access checking violations are treated as SFINAE failures rather than hard errors.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
void setFunctionHasMustTail()
void CheckCompleteVariableDeclaration(VarDecl *VD)
void setFunctionHasBranchProtectedScope()
RedeclarationKind forRedeclarationInCurContext() const
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
@ NonDefaultStateAtInclude
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
std::pair< SourceLocation, bool > DeleteExprLoc
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const
Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
SourceManager & SourceMgr
DiagnosticsEngine & Diags
void DiagnoseUnterminatedPragmaAlignPack()
OpenCLOptions & getOpenCLOptions()
LateTemplateParserCleanupCB * LateTemplateParserCleanup
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
void PrintStats() const
Print out statistics about the semantic analysis.
llvm::BumpPtrAllocator BumpAlloc
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
sema::FunctionScopeInfo * getEnclosingFunction() const
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB)
Cause the built diagnostic to be emitted on the DiagosticsEngine.
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
IdentifierResolver IdResolver
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
ASTMutationListener * getASTMutationListener() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
void setEnd(SourceLocation e)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Exposes information about the current target.
virtual bool hasLongDoubleType() const
Determine whether the long double type is supported on this target.
virtual bool hasBitIntType() const
Determine whether the _BitInt type is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFPReturn() const
Determine whether return of a floating point value is supported on this target.
bool hasBuiltinMSVaList() const
Returns whether or not type __builtin_ms_va_list type is available on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
bool hasAArch64ACLETypes() const
Returns whether or not the AArch64 ACLE built-in types are available on this target.
virtual bool hasBFloat16Type() const
Determine whether the _BFloat16 type is supported on this target.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
bool hasRISCVVTypes() const
Returns whether or not the RISC-V V built-in types are available on this target.
A container of type source information.
The base class of the type hierarchy.
bool isFloat16Type() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isFloat128Type() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
bool isIbm128Type() const
bool isBFloat16Type() const
bool isStructureOrClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
Linkage getLinkage() const
Determine the linkage of this type.
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Base class for declarations which introduce a typedef-name.
A set of unresolved declarations.
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
A set of unresolved declarations.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
const Expr * getInit() const
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
@ DeclarationOnly
This declaration is only a declaration.
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Declaration of a variable template.
Represents a GCC generic vector type.
Policy & getPolicyOverrides()
void IssueWarnings(Policy P, FunctionScopeInfo *fscope, const Decl *D, QualType BlockType)
Retains information about a block that is currently being parsed.
Retains information about a captured region.
Contains information about the compound statement currently being parsed.
Retains information about a function, method, or block that is currently being parsed.
SmallVector< CompoundScopeInfo, 4 > CompoundScopes
The stack of currently active compound statement scopes in the function.
llvm::SmallPtrSet< const BlockDecl *, 1 > Blocks
The set of blocks that are introduced in this function.
llvm::TinyPtrVector< VarDecl * > ByrefBlockVars
The set of __block variables that are introduced in this function.
void FileChanged(SourceLocation Loc, FileChangeReason Reason, SrcMgr::CharacteristicKind FileType, FileID PrevFID) override
Callback invoked whenever a source file is entered or exited.
void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace, diag::Severity Mapping, StringRef Str) override
Callback invoked when a #pragma gcc diagnostic directive is read.
Defines the clang::TargetInfo interface.
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
Flavor
Flavors of diagnostics we can emit.
@ WarningOrError
A diagnostic that indicates a problem or potential problem.
@ Remark
A diagnostic that indicates normal progress through compilation.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
void threadSafetyCleanup(BeforeSet *Cache)
The JSON file list parser is used to communicate input to InstallAPI.
@ ExpectedVariableOrFunction
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ Nullable
Values of this type can be null.
@ NonNull
Values of this type can never be null.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
void inferNoReturnAttr(Sema &S, const Decl *D)
CapturedRegionKind
The different kinds of captured statement.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ Result
The result type of a method or function.
@ Template
We are parsing a template declaration.
@ Private
The private module fragment, between 'module :private;' and the end of the translation unit.
@ Global
The global module fragment, between 'module;' and a module-declaration.
@ Normal
A normal translation unit fragment.
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_ClangModule
The translation unit is a clang module.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
void FormatASTNodeDiagnosticArgument(DiagnosticsEngine::ArgumentKind Kind, intptr_t Val, StringRef Modifier, StringRef Argument, ArrayRef< DiagnosticsEngine::ArgumentValue > PrevArgs, SmallVectorImpl< char > &Output, void *Cookie, ArrayRef< intptr_t > QualTypeVals)
DiagnosticsEngine argument formatting function for diagnostics that involve AST nodes.
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_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
bool isExternalFormalLinkage(Linkage L)
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
@ Class
The "class" keyword introduces the elaborated-type-specifier.
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
bool isExternallyVisible(Linkage L)
CheckedConversionKind
The kind of conversion being performed.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
bool HasFormOfMemberPointer
OverloadExpr * Expression
Describes how types, statements, expressions, and declarations should be printed.
unsigned Bool
Whether we can use 'bool' rather than '_Bool' (even if the language doesn't actually have 'bool',...
unsigned EntireContentsOfLargeArray
Whether to print the entire array initializers, especially on non-type template parameters,...
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.