74#include "llvm/ADT/DenseMap.h"
75#include "llvm/ADT/STLExtras.h"
76#include "llvm/ADT/SetVector.h"
77#include "llvm/ADT/SmallPtrSet.h"
78#include "llvm/Support/TimeProfiler.h"
91 std::optional<tok::TokenKind> ExpectedToken) {
94 std::optional<Token> NextToken =
98 if (ExpectedToken && NextToken->getKind() != *ExpectedToken)
114 StringRef Platform) {
116 if (!SDKInfo && !WarnedDarwinSDKInfoMissing) {
117 Diag(Loc, diag::warn_missing_sdksettings_for_availability_checking)
119 WarnedDarwinSDKInfoMissing =
true;
125 if (CachedDarwinSDKInfo)
126 return CachedDarwinSDKInfo->get();
128 PP.getFileManager().getVirtualFileSystem(),
129 PP.getHeaderSearchInfo().getHeaderSearchOpts().Sysroot);
130 if (SDKInfo && *SDKInfo) {
131 CachedDarwinSDKInfo = std::make_unique<DarwinSDKInfo>(std::move(**SDKInfo));
132 return CachedDarwinSDKInfo->get();
135 llvm::consumeError(SDKInfo.takeError());
136 CachedDarwinSDKInfo = std::unique_ptr<DarwinSDKInfo>();
142 std::string InventedName;
143 llvm::raw_string_ostream
OS(InventedName);
146 OS <<
"auto:" << Index + 1;
161 Policy.
Bool = BoolMacro->isObjectLike() &&
162 BoolMacro->getNumTokens() == 1 &&
163 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
193 FileID PrevFID)
override {
201 if (llvm::timeTraceProfilerEnabled()) {
203 ProfilerStack.push_back(llvm::timeTraceAsyncProfilerBegin(
204 "Source", FE ? FE->
getName() : StringRef(
"<unknown>")));
207 IncludeStack.push_back(IncludeLoc);
208 S->DiagnoseNonDefaultPragmaAlignPack(
215 if (!IncludeStack.empty()) {
216 if (llvm::timeTraceProfilerEnabled())
217 llvm::timeTraceProfilerEnd(ProfilerStack.pop_back_val());
219 S->DiagnoseNonDefaultPragmaAlignPack(
221 IncludeStack.pop_back_val());
232 S->AnalysisWarnings.clearPolicyCache();
233 S->clearDocumentationDiagsCache();
242 StringRef Group = Str.substr(2);
244 if (S->PP.getDiagnostics().getDiagnosticIDs()->getDiagnosticsInGroup(
245 Flavor, Group, GroupDiags))
252 S->AnalysisWarnings.getPolicyOverrides();
255 case diag::warn_unreachable:
256 case diag::warn_unreachable_break:
257 case diag::warn_unreachable_return:
258 case diag::warn_unreachable_loop_increment:
259 Override.enableCheckUnreachable =
true;
261 case diag::warn_double_lock:
262 Override.enableThreadSafetyAnalysis =
true;
264 case diag::warn_use_in_invalid_state:
265 Override.enableConsumedAnalysis =
true;
316 LangOpts.getMSPointerToMemberRepresentationMethod()),
326 FullyCheckedComparisonCategories(
336 LoadedExternalKnownNamespaces =
false;
357 OpenMP().InitDataSharingAttributesStack();
359 std::unique_ptr<sema::SemaPPCallbacks> Callbacks =
360 std::make_unique<sema::SemaPPCallbacks>();
361 SemaPPCallbackHandler = Callbacks.get();
362 PP.addPPCallbacks(std::move(Callbacks));
363 SemaPPCallbackHandler->set(*
this);
369void Sema::anchor() {}
381 if (
Context.getTargetInfo().hasBuiltinMSVaList())
382 (void)
Context.getBuiltinMSVaListDecl();
383 if (
Context.getTargetInfo().hasBuiltinZOSVaList())
384 (void)
Context.getBuiltinZOSVaListDecl();
385 (void)
Context.getBuiltinVaListDecl();
388 SC->InitializeSema(*
this);
392 = dyn_cast_or_null<ExternalSemaSource>(
Context.getExternalSource()))
393 ExternalSema->InitializeSema(*
this);
403 if (
Context.getTargetInfo().hasInt128Type() ||
405 Context.getAuxTargetInfo()->hasInt128Type())) {
465 if (OCLCompatibleVersion >= 200) {
494 auto AddPointerSizeDependentTypes = [&]() {
496 auto AtomicIntPtrT =
Context.getAtomicType(
Context.getIntPtrType());
497 auto AtomicUIntPtrT =
Context.getAtomicType(
Context.getUIntPtrType());
498 auto AtomicPtrDiffT =
507 AddPointerSizeDependentTypes();
515 std::vector<QualType> Atomic64BitTypes;
523 Atomic64BitTypes.push_back(AtomicDoubleT);
526 auto AtomicULongT =
Context.getAtomicType(
Context.UnsignedLongTy);
532 AddPointerSizeDependentTypes();
537#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
538 if (getOpenCLOptions().isSupported(#Ext, getLangOpts())) { \
539 addImplicitTypedef(#ExtType, Context.Id##Ty); \
541#include "clang/Basic/OpenCLExtensionTypes.def"
544 if (
Context.getTargetInfo().hasAArch64ACLETypes() ||
546 Context.getAuxTargetInfo()->hasAArch64ACLETypes())) {
547#define SVE_TYPE(Name, Id, SingletonId) \
548 addImplicitTypedef(#Name, Context.SingletonId);
549#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
550 addImplicitTypedef( \
551 #Name, Context.getVectorType(Context.BaseType, NumEls, VectorKind));
552#include "clang/Basic/AArch64ACLETypes.def"
555 if (
Context.getTargetInfo().getTriple().isPPC64()) {
556#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
557 addImplicitTypedef(#Name, Context.Id##Ty);
558#include "clang/Basic/PPCTypes.def"
559#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
560 addImplicitTypedef(#Name, Context.Id##Ty);
561#include "clang/Basic/PPCTypes.def"
564 if (
Context.getTargetInfo().hasRISCVVTypes()) {
565#define RVV_TYPE(Name, Id, SingletonId) \
566 addImplicitTypedef(Name, Context.SingletonId);
567#include "clang/Basic/RISCVVTypes.def"
570 if (
Context.getTargetInfo().getTriple().isWasm() &&
571 Context.getTargetInfo().hasFeature(
"reference-types")) {
572#define WASM_TYPE(Name, Id, SingletonId) \
573 addImplicitTypedef(Name, Context.SingletonId);
574#include "clang/Basic/WebAssemblyReferenceTypes.def"
577 if (
Context.getTargetInfo().hasAMDGPUTypes() ||
579 (
Context.getAuxTargetInfo()->hasAMDGPUTypes()))) {
580#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
581 addImplicitTypedef(Name, Context.SingletonId);
582#include "clang/Basic/AMDGPUTypes.def"
585 if (
Context.getTargetInfo().getTriple().isSPIRV() ||
587 Context.getAuxTargetInfo()->getTriple().isSPIRV())) {
588#define SPIRV_TYPE(Name, Id, SingletonId) \
589 addImplicitTypedef(Name, Context.SingletonId);
590#include "clang/Basic/SPIRVTypes.def"
593 if (
Context.getTargetInfo().hasBuiltinMSVaList()) {
599 if (
Context.getTargetInfo().hasBuiltinZOSVaList()) {
612 "failed to clean up an InstantiatingTemplate?");
626 = dyn_cast_or_null<ExternalSemaSource>(
Context.getExternalSource()))
627 ExternalSema->ForgetSema();
630 std::vector<ConstraintSatisfaction *> Satisfactions;
631 Satisfactions.reserve(SatisfactionCache.size());
632 for (
auto &Node : SatisfactionCache)
633 Satisfactions.push_back(&Node);
634 for (
auto *Node : Satisfactions)
640 OpenMP().DestroyDataSharingAttributesStack();
644 SemaPPCallbackHandler->reset();
648 llvm::function_ref<
void()> Fn) {
649 StackHandler.runWithSufficientStackSpace(Loc, Fn);
653 UnavailableAttr::ImplicitReason reason) {
656 if (!fn)
return false;
663 if (!
Context.getSourceManager().isInSystemHeader(loc))
667 if (fn->
hasAttr<UnavailableAttr>())
return true;
669 fn->
addAttr(UnavailableAttr::CreateImplicit(
Context,
"", reason, loc));
678 assert(E &&
"Cannot use with NULL ptr");
685 if (
auto *Ex = dyn_cast<MultiplexExternalSemaSource>(
ExternalSource.get()))
686 Ex->AddSource(std::move(E));
688 ExternalSource = llvm::makeIntrusiveRefCnt<MultiplexExternalSemaSource>(
693 llvm::errs() <<
"\n*** Semantic Analysis Stats:\n";
695 llvm::errs() <<
int(Trap->hasErrorOccurred())
696 <<
" SFINAE diagnostics trapped.\n";
714 Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;
722 if (SrcFX != DstFX) {
724 if (Diff.shouldDiagnoseConversion(SrcType, SrcFX, DstType, DstFX))
725 Diag(Loc, diag::warn_invalid_add_func_effects) << Diff.effectName();
735 if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
744 if (
Diags.isIgnored(diag::warn_zero_as_null_pointer_constant,
766 if (
Diags.getSuppressSystemWarnings() &&
767 SourceMgr.isInSystemMacro(MaybeMacroLoc) &&
787 (
"can't implicitly cast glvalue to prvalue with this cast "
792 case CK_LValueToRValue:
793 case CK_ArrayToPointerDecay:
794 case CK_FunctionToPointerDecay:
796 case CK_NonAtomicToAtomic:
797 case CK_HLSLArrayRValue:
798 case CK_HLSLAggregateSplatCast:
803 "can't cast prvalue to glvalue");
809 Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
827 if (Kind == CK_ArrayToPointerDecay) {
836 E = Materialized.
get();
847 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
848 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
860 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
861 ImpCast->setType(Ty);
862 ImpCast->setValueKind(
VK);
870 if ((Kind == CK_IntegralCast || Kind == CK_IntegralToBoolean ||
874 if (
const auto *SourceOBT = E->
getType()->
getAs<OverflowBehaviorType>()) {
876 Ty =
Context.getOverflowBehaviorType(SourceOBT->getBehaviorKind(), Ty);
898 llvm_unreachable(
"unknown scalar type kind");
909 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
913 for (
const auto *Spec :
Template->specializations())
920 if (FD->hasBody(DeclToCheck))
926 if (DeclToCheck != FD)
930 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
936 if (VD->isReferenced() &&
937 VD->mightBeUsableInConstantExpressions(SemaRef->
Context))
943 for (
const auto *Spec :
Template->specializations())
956 if (DeclToCheck != VD)
964 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
965 return FD->isExternC();
997 if (ND->
hasAttr<WeakRefAttr>())
continue;
1002 if (ND->
hasAttr<DLLImportAttr>() || ND->
hasAttr<DLLExportAttr>()) {
1009 if (
const auto *FD = dyn_cast<FunctionDecl>(ND)) {
1010 if (FD->isDefined())
1012 if (FD->isExternallyVisible() &&
1014 !FD->getMostRecentDecl()->isInlined() &&
1015 !FD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
1017 if (FD->getBuiltinID())
1023 if (VD->isExternallyVisible() &&
1025 !VD->getMostRecentDecl()->isInline() &&
1026 !VD->hasAttr<ExcludeFromExplicitInstantiationAttr>())
1031 if (VD->isKnownToBeDefined())
1035 Undefined.push_back(std::make_pair(ND, UndefinedUse.second));
1065 ? diag::ext_undefined_internal_type
1066 : diag::err_undefined_internal_type)
1072 bool IsImplicitBase =
false;
1073 if (
const auto *BaseD = dyn_cast<FunctionDecl>(VD)) {
1074 auto *DVAttr = BaseD->getAttr<OMPDeclareVariantAttr>();
1075 if (DVAttr && !DVAttr->getTraitInfo().isExtensionActive(
1076 llvm::omp::TraitProperty::
1077 implementation_extension_disable_implicit_base)) {
1080 IsImplicitBase = BaseD->isImplicit() &&
1081 Func->getIdentifier()->isMangledOpenMPVariantName();
1087 }
else if (
auto *FD = dyn_cast<FunctionDecl>(VD)) {
1089 assert(FD->getMostRecentDecl()->isInlined() &&
1090 "used object requires definition but isn't inline or internal?");
1094 assert(
cast<VarDecl>(VD)->getMostRecentDecl()->isInline() &&
1095 "used var requires definition but isn't inline or internal?");
1099 S.
Diag(UseLoc, diag::note_used_here);
1109 for (
auto &WeakID : WeakIDs)
1119 for (
auto &ExtnameID : ExtnameIDs)
1132 RecordCompleteMap::iterator
Cache = MNCComplete.find(RD);
1133 if (
Cache != MNCComplete.end())
1134 return Cache->second;
1142 Complete = M->isDefined() || M->isDefaulted() ||
1149 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
1150 F->getTemplatedDecl()->isDefined();
1151 else if (
const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) {
1152 if (R->isInjectedClassName())
1154 if (R->hasDefinition())
1175 RecordCompleteMap::iterator
Cache = RecordsComplete.find(RD);
1176 if (
Cache != RecordsComplete.end())
1177 return Cache->second;
1186 if (
CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
1193 dyn_cast<FunctionDecl>(
Friend->getFriendDecl()))
1224 if (TD->isReferenced())
1226 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
1235 HandleStartOfHeaderUnit();
1242 llvm::TimeTraceScope TimeScope(
"PerformPendingInstantiations");
1279 for (
auto PII : Pending)
1280 if (
auto Func = dyn_cast<FunctionDecl>(PII.first))
1281 Func->setInstantiationIsPending(
true);
1283 Pending.begin(), Pending.end());
1287 llvm::TimeTraceScope TimeScope(
"PerformPendingInstantiations");
1294 "end of TU template instantiation should not create more "
1295 "late-parsed templates");
1300 &&
"reached end of translation unit with a pool attached?");
1304 if (
PP.isCodeCompletionEnabled())
1313 !ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1330 if (
LangOpts.PCHInstantiateTemplates) {
1331 llvm::TimeTraceScope TimeScope(
"PerformPendingInstantiations");
1356 return ShouldRemoveFromUnused(this, DD);
1362 if (!
PP.isIncrementalProcessingEnabled())
1370 if (WeakIDs.second.empty())
1375 if (PrevDecl !=
nullptr &&
1377 for (
const auto &WI : WeakIDs.second)
1378 Diag(WI.getLocation(), diag::warn_attribute_wrong_decl_type)
1381 for (
const auto &WI : WeakIDs.second)
1382 Diag(WI.getLocation(), diag::warn_weak_identifier_undeclared)
1390 if (!
Diags.hasErrorOccurred()) {
1397 if (!ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==
1399 Diag(ModuleScopes.back().BeginLoc,
1400 diag::err_module_declaration_missing_after_global_module_introducer);
1412 diag::err_module_declaration_missing);
1418 auto DoesModNeedInit = [
this](
Module *M) {
1420 auto *VD = dyn_cast<VarDecl>(D);
1426 (InitDecl && !InitDecl->hasConstantInitialization()) ||
1431 for (
auto [Exported, _] : M->Exports)
1432 if (Exported->isNamedModuleInterfaceHasInit())
1441 CurrentModule->NamedModuleHasInit =
1442 DoesModNeedInit(CurrentModule) ||
1443 llvm::any_of(CurrentModule->submodules(), DoesModNeedInit);
1449 if (
Module *CurrentModule =
PP.getCurrentModule()) {
1450 ModuleMap &ModMap =
PP.getHeaderSearchInfo().getModuleMap();
1453 Stack.push_back(CurrentModule);
1454 while (!Stack.empty()) {
1455 Module *Mod = Stack.pop_back_val();
1467 Stack.append(SubmodulesRange.begin(), SubmodulesRange.end());
1479 if (!PendingInlineFuncDecls.empty()) {
1480 for (
auto *FD : PendingInlineFuncDecls) {
1481 bool DefInPMF =
false;
1482 if (
auto *FDD = FD->getDefinition()) {
1483 DefInPMF = FDD->getOwningModule()->isPrivateModule();
1487 Diag(FD->getLocation(), diag::err_export_inline_not_defined) << DefInPMF;
1491 Diag(ModuleScopes.back().BeginLoc, diag::note_private_module_fragment);
1494 PendingInlineFuncDecls.clear();
1509 for (TentativeDefinitionsType::iterator
1525 llvm::APInt One(
Context.getTypeSize(
Context.getSizeType()),
true);
1530 diag::err_tentative_def_incomplete_type))
1541 unsigned DiagID = diag::warn_default_init_const_unsafe;
1544 DiagID = diag::warn_default_init_const;
1546 bool EmitCppCompat = !
Diags.isIgnored(
1547 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
1561 for (
const FieldDecl *FD : RD->fields())
1562 if (FD->hasAttr<ExplicitInitAttr>())
1563 Diag(FD->getLocation(), diag::note_entity_declared_at) << FD;
1569 Consumer.CompleteTentativeDefinition(VD);
1575 if (
PP.isIncrementalProcessingEnabled())
1580 if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed())
1583 Consumer.CompleteExternalDeclaration(D);
1589 Diag(Exported.NameLoc, diag::warn_failed_to_resolve_pragma) <<
"export";
1604 for (UnusedFileScopedDeclsType::iterator
1611 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
1613 if (!FD->hasBody(DiagD))
1620 DiagRange.
setEnd(ASTTAL->RAngleLoc);
1624 << DiagD << DiagRange;
1626 if (FD->getStorageClass() ==
SC_Static &&
1627 !FD->isInlineSpecified() &&
1629 SourceMgr.getExpansionLoc(FD->getLocation())))
1631 diag::warn_unneeded_static_internal_decl)
1632 << DiagD << DiagRange;
1635 << 0 << DiagD << DiagRange;
1637 }
else if (!FD->isTargetMultiVersion() ||
1638 FD->isTargetMultiVersionDefault()) {
1639 if (FD->getDescribedFunctionTemplate())
1641 << 0 << DiagD << DiagRange;
1644 ? diag::warn_unused_member_function
1645 : diag::warn_unused_function)
1646 << DiagD << DiagRange;
1653 if (
const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(DiagD)) {
1655 VTSD->getTemplateArgsAsWritten())
1656 DiagRange.
setEnd(ASTTAL->RAngleLoc);
1660 << 1 << DiagD << DiagRange;
1663 << 1 << DiagD << DiagRange;
1667 !
PP.getLangOpts().IsHeaderFile)
1669 << DiagD << DiagRange;
1672 << DiagD << DiagRange;
1690 DeclDiags.push_back(LocAndDiag{Loc, std::move(PD)});
1696 const VarDecl *VD = Ref.first;
1704 llvm::sort(DeclDiags,
1705 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
1708 return LHS.Loc < RHS.Loc;
1710 for (
const LocAndDiag &D : DeclDiags)
1720 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
1721 if (RD && !RD->
isUnion() && !D->hasAttr<UnusedAttr>() &&
1723 Diag(D->getLocation(), diag::warn_unused_private_field)
1724 << D->getDeclName();
1732 for (
const auto &DeletedFieldInfo :
DeleteExprs) {
1734 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first,
DeleteExprLoc.first,
1742 if (
Context.hasAnyFunctionEffects())
1749 "Didn't unmark var as having its initializer parsed");
1751 if (!
PP.isIncrementalProcessingEnabled())
1754 checkExposure(
Context.getTranslationUnitDecl());
1785 return dyn_cast<FunctionDecl>(DC);
1792 return dyn_cast<ObjCMethodDecl>(DC);
1827 Trap->setErrorOccurred();
1836 Diags.setLastDiagnosticIgnored(
true);
1850 Trap->setErrorOccurred();
1859 Diags.setLastDiagnosticIgnored(
true);
1862 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1866 Diags.setLastDiagnosticIgnored(
true);
1881 if (!
Diags.getDiagnosticIDs()->isNote(DiagID))
1888 Diags.setLastDiagnosticIgnored(
true);
1898 if (!
Diags.EmitDiagnostic(DB))
1905 if (!
Diags.getDiagnosticIDs()->isNote(DiagID))
1912 auto *FD = dyn_cast<FunctionDecl>(
CurContext);
1918 for (
auto PDAt : Loc->second) {
1919 if (
Diags.getDiagnosticIDs()->isDefaultMappingAsError(
1920 PDAt.second.getDiagID()))
1935 for (
const auto &CallerInfo : FnIt->second) {
1938 S.
Diags.
Report(CallerInfo.Loc, diag::note_called_by) << CallerInfo.FD;
1944 const auto &
Next = NextIt->second.front();
1980class DeferredDiagnosticsEmitter
1983 typedef UsedDeclVisitor<DeferredDiagnosticsEmitter> Inherited;
1986 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> InUsePath;
1989 llvm::SmallVector<CanonicalDeclPtr<FunctionDecl>, 4> UsePath;
1995 llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> DoneMap[2];
2000 llvm::SetVector<CanonicalDeclPtr<const FunctionDecl>> FnsToEmit;
2003 bool ShouldEmitRootNode;
2008 unsigned InOMPDeviceContext;
2010 DeferredDiagnosticsEmitter(Sema &S)
2011 : Inherited(S), ShouldEmitRootNode(
false), InOMPDeviceContext(0) {}
2013 bool shouldVisitDiscardedStmt()
const {
return false; }
2015 void VisitOMPTargetDirective(OMPTargetDirective *Node) {
2016 ++InOMPDeviceContext;
2017 Inherited::VisitOMPTargetDirective(Node);
2018 --InOMPDeviceContext;
2021 void visitUsedDecl(SourceLocation Loc, Decl *D) {
2024 if (
auto *FD = dyn_cast<FunctionDecl>(D))
2027 Inherited::visitUsedDecl(Loc, D);
2031 void VisitCalledDestructors(CXXDestructorDecl *DD) {
2032 const CXXRecordDecl *RD = DD->
getParent();
2035 for (
const FieldDecl *FD : RD->
fields()) {
2036 QualType FT = FD->getType();
2039 (ClassDecl->isBeingDefined() || ClassDecl->isCompleteDefinition()))
2040 if (CXXDestructorDecl *MemberDtor = ClassDecl->getDestructor())
2041 asImpl().visitUsedDecl(MemberDtor->getLocation(), MemberDtor);
2045 for (
const auto &Base : RD->
bases()) {
2046 QualType BaseType =
Base.getType();
2049 (BaseDecl->isBeingDefined() || BaseDecl->isCompleteDefinition()))
2050 if (CXXDestructorDecl *BaseDtor = BaseDecl->getDestructor())
2051 asImpl().visitUsedDecl(BaseDtor->getLocation(), BaseDtor);
2055 void VisitDeclStmt(DeclStmt *DS) {
2057 for (
auto *D : DS->
decls())
2058 if (
auto *VD = dyn_cast<VarDecl>(D))
2059 if (VD->isThisDeclarationADefinition() &&
2060 VD->needsDestruction(S.Context)) {
2061 QualType VT = VD->getType();
2063 ClassDecl && (ClassDecl->isBeingDefined() ||
2064 ClassDecl->isCompleteDefinition()))
2065 if (CXXDestructorDecl *Dtor = ClassDecl->getDestructor())
2066 asImpl().visitUsedDecl(
Dtor->getLocation(), Dtor);
2069 Inherited::VisitDeclStmt(DS);
2071 void checkVar(VarDecl *VD) {
2073 "Should only check file-scope variables");
2075 auto DevTy = OMPDeclareTargetDeclAttr::getDeviceType(VD);
2076 bool IsDev = DevTy && (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost ||
2077 *DevTy == OMPDeclareTargetDeclAttr::DT_Any);
2079 ++InOMPDeviceContext;
2082 --InOMPDeviceContext;
2086 void checkFunc(SourceLocation Loc, FunctionDecl *FD) {
2087 auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];
2088 FunctionDecl *Caller = UsePath.empty() ?
nullptr : UsePath.back();
2089 if ((!ShouldEmitRootNode && !S.getLangOpts().OpenMP && !Caller) ||
2090 S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD))
2093 if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1 &&
2094 (ShouldEmitRootNode || InOMPDeviceContext))
2095 S.OpenMP().finalizeOpenMPDelayedAnalysis(Caller, FD, Loc);
2097 auto &Callers = S.CUDA().DeviceKnownEmittedFns[FD];
2098 CanonicalDeclPtr<const FunctionDecl> CanonCaller(Caller);
2099 if (llvm::none_of(Callers, [CanonCaller](
const auto &
C) {
2100 return C.FD == CanonCaller;
2102 Callers.push_back({Caller, Loc});
2104 if (ShouldEmitRootNode || InOMPDeviceContext)
2105 FnsToEmit.insert(FD);
2108 if (!Done.insert(FD).second)
2110 InUsePath.insert(FD);
2111 UsePath.push_back(FD);
2117 if (
auto *Ctor = dyn_cast_or_null<CXXConstructorDecl>(
Definition)) {
2118 for (
auto *
Init : Ctor->inits())
2119 this->Visit(
Init->getInit());
2122 if (CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(FD))
2123 asImpl().VisitCalledDestructors(Dtor);
2125 InUsePath.erase(FD);
2128 void checkRecordedDecl(Decl *D) {
2129 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
2130 ShouldEmitRootNode = S.getEmissionStatus(FD,
true) ==
2131 Sema::FunctionEmissionStatus::Emitted;
2132 checkFunc(SourceLocation(), FD);
2137 void emitDeferredDiags(
const FunctionDecl *FD) {
2138 auto It = S.DeviceDeferredDiags.find(FD);
2139 if (It == S.DeviceDeferredDiags.end())
2141 bool HasWarningOrError =
false;
2143 if (S.Diags.hasFatalErrorOccurred())
2145 const SourceLocation &Loc = PDAt.first;
2146 const PartialDiagnostic &PD = PDAt.second;
2147 HasWarningOrError |=
2148 S.getDiagnostics().getDiagnosticLevel(PD.
getDiagID(), Loc) >=
2151 DiagnosticBuilder Builder(S.Diags.Report(Loc, PD.
getDiagID()));
2155 if (HasWarningOrError)
2159 void emitCollectedDiags() {
2160 for (
const auto &FD : FnsToEmit)
2161 emitDeferredDiags(FD);
2173 auto ClassifyImplicitHDExplicitInst = [&]() {
2180 if (
CUDA().DeviceKnownEmittedFns.count(FD))
2184 return getDiagnostics().getDiagnosticLevel(PDAt.second.getDiagID(),
2186 DiagnosticsEngine::Error;
2190 Pair.second.clear();
2197 ClassifyImplicitHDExplicitInst();
2201 DeferredDiagnosticsEmitter DDE(*
this);
2203 DDE.checkRecordedDecl(D);
2204 ClassifyImplicitHDExplicitInst();
2205 DDE.emitCollectedDiags();
2232Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(Kind K,
SourceLocation Loc,
2236 : S(S), Loc(Loc), DiagID(DiagID), Fn(Fn),
2237 ShowCallStack(K == K_ImmediateWithCallStack || K == K_Deferred) {
2242 case K_ImmediateWithCallStack:
2243 ImmediateDiag.emplace(
2244 ImmediateDiagBuilder(S.
Diags.
Report(Loc, DiagID), S, DiagID));
2247 assert(Fn &&
"Must have a function to attach the deferred diag to.");
2249 PartialDiagId.emplace(
Diags.size());
2255Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(SemaDiagnosticBuilder &&D)
2256 : S(D.S), Loc(D.Loc), DiagID(D.DiagID),
Fn(D.
Fn),
2257 ShowCallStack(D.ShowCallStack), ImmediateDiag(D.ImmediateDiag),
2258 PartialDiagId(D.PartialDiagId) {
2260 D.ShowCallStack =
false;
2261 D.ImmediateDiag.reset();
2262 D.PartialDiagId.reset();
2265Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
2266 if (ImmediateDiag) {
2269 ImmediateDiag.reset();
2271 if (ShowCallStack) {
2272 bool IsWarningOrError = S.getDiagnostics().getDiagnosticLevel(
2274 if (IsWarningOrError)
2278 assert((!PartialDiagId || ShowCallStack) &&
2279 "Must always show call stack for deferred diags.");
2283Sema::SemaDiagnosticBuilder
2289 return LangOpts.OpenMPIsTargetDevice
2290 ?
OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD)
2291 :
OpenMP().diagIfOpenMPHostCode(Loc, DiagID, FD);
2293 return getLangOpts().CUDAIsDevice ?
CUDA().DiagIfDeviceCode(Loc, DiagID)
2294 :
CUDA().DiagIfHostCode(Loc, DiagID);
2297 return SYCL().DiagIfDeviceCode(Loc, DiagID);
2312 llvm::DenseSet<QualType> Visited;
2313 SYCL().deepTypeCheckForDevice(Loc, Visited, D);
2320 if (
const auto *MD = dyn_cast<CXXMethodDecl>(
C)) {
2321 if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&
2325 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD))
2326 if (Ctor->isCopyOrMoveConstructor() && Ctor->isTrivial())
2334 : dyn_cast_or_null<FunctionDecl>(D);
2336 auto CheckDeviceType = [&](
QualType Ty) {
2341 if (!
Context.getTargetInfo().hasBitIntType()) {
2348 <<
false << 0 <<
false
2349 << Ty <<
Context.getTargetInfo().getTriple().str();
2356 bool LongDoubleMismatched =
false;
2358 const llvm::fltSemantics &Sem =
Context.getFloatTypeSemantics(Ty);
2359 if ((&Sem != &llvm::APFloat::PPCDoubleDouble() &&
2360 !
Context.getTargetInfo().hasFloat128Type()) ||
2361 (&Sem == &llvm::APFloat::PPCDoubleDouble() &&
2362 !
Context.getTargetInfo().hasIbm128Type()))
2363 LongDoubleMismatched =
true;
2370 !
Context.getTargetInfo().hasInt128Type()) ||
2373 LongDoubleMismatched) {
2382 <<
static_cast<unsigned>(
Context.getTypeSize(Ty)) << Ty
2383 <<
false <<
Context.getTargetInfo().getTriple().str()) {
2385 D->setInvalidDecl();
2388 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2392 auto CheckType = [&](
QualType Ty,
bool IsRetTy =
false) {
2396 CheckDeviceType(Ty);
2407 if (
Diag(Loc, PD) <<
false << 0 << Ty
2411 D->setInvalidDecl();
2414 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2417 bool IsDouble = UnqualTy ==
Context.DoubleTy;
2418 bool IsFloat = UnqualTy ==
Context.FloatTy;
2419 if (IsRetTy && !TI.
hasFPReturn() && (IsDouble || IsFloat)) {
2426 if (
Diag(Loc, PD) <<
false << 0 << Ty <<
true
2429 D->setInvalidDecl();
2432 targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;
2436 llvm::StringMap<bool> CallerFeatureMap;
2437 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2438 RISCV().checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);
2443 llvm::StringMap<bool> CallerFeatureMap;
2444 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
2445 ARM().checkSVETypeSupport(Ty, Loc, FD, CallerFeatureMap);
2449 AMDGPU().checkAMDGPUTypeSupport(Ty, Loc);
2458 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2461 if (FTy->getAArch64SMEAttributes() &
2463 Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)
2471 if (
const auto *FPTy = dyn_cast<FunctionProtoType>(Ty)) {
2472 for (
const auto &ParamTy : FPTy->param_types())
2474 CheckType(FPTy->getReturnType(),
true);
2476 if (
const auto *FNPTy = dyn_cast<FunctionNoProtoType>(Ty))
2477 CheckType(FNPTy->getReturnType(),
true);
2525 OpenMP().pushOpenMPFunctionRegion();
2530 BlockScope,
Block));
2543 LSI->AutoTemplateParameterDepth = Depth;
2547 "Remove assertion if intentionally called in a non-lambda context.");
2574 if (!
Result.isInvalid()) {
2594 VarDecl *VD = BC.getVariable();
2595 if (VD->
hasAttr<BlocksAttr>()) {
2604 QualType CapType = BC.getVariable()->getType();
2645 for (
const auto &PUD :
Scope->PossiblyUnreachableDiags)
2646 Diag(PUD.Loc, PUD.PD);
2653 if (!
Scope->isPlainFunction())
2654 Self->CapturingFunctionScopes--;
2656 if (
Scope->isPlainFunction() && !Self->CachedFunctionScope)
2657 Self->CachedFunctionScope.reset(
Scope);
2669 assert(!CurFunction->
CompoundScopes.empty() &&
"mismatched push/pop");
2703 if (CurBSI && CurBSI->TheDecl &&
2727 if (
auto *CSI = dyn_cast<CapturingScopeInfo>(
Scope)) {
2728 auto *LSI = dyn_cast<LambdaScopeInfo>(CSI);
2729 if (LSI && LSI->Lambda && !LSI->Lambda->Encloses(
CurContext) &&
2730 LSI->AfterParameterList) {
2748 if (IgnoreNonLambdaCapturingScope) {
2755 auto *CurLSI = dyn_cast<LambdaScopeInfo>(*I);
2756 if (CurLSI && CurLSI->Lambda && CurLSI->CallOperator &&
2757 !CurLSI->Lambda->Encloses(
CurContext) && CurLSI->AfterParameterList) {
2770 return (LSI->TemplateParams.size() ||
2771 LSI->GLTemplateParameterList) ? LSI :
nullptr;
2777 if (!
LangOpts.CommentOpts.RetainCommentsFromSystemHeaders &&
2781 if (
LangOpts.CommentOpts.ParseAllComments)
2784 if (
LangOpts.CommentOpts.RetainComments)
2793 if (
PP.isCodeCompletionEnabled())
2802bool Sema::computeDocumentationDiagsAt(
SourceLocation Loc)
const {
2803 return !Diags.areAllIgnored(
"documentation", Loc) ||
2804 !Diags.areAllIgnored(
"documentation-pedantic", Loc);
2808 DocDiagsStateKey =
nullptr;
2809 DocDiagsExactComputed = 0;
2816 return computeDocumentationDiagsAt(Loc);
2818 const void *StateKey =
Diags.getDiagStateKeyForLoc(Loc);
2819 if (StateKey != DocDiagsStateKey) {
2820 DocDiagsStateKey = StateKey;
2824 DocDiagsEnabledIgnoringSystem = computeDocumentationDiagsAt(Loc);
2826 DocDiagsExactComputed = 0;
2829 if (!DocDiagsEnabledIgnoringSystem)
2836 const unsigned Bit = 1u <<
static_cast<unsigned>(SysClass);
2837 if (!(DocDiagsExactComputed & Bit)) {
2838 DocDiagsExactComputed |= Bit;
2839 if (computeDocumentationDiagsAt(Loc))
2840 DocDiagsExactEnabled |= Bit;
2842 DocDiagsExactEnabled &= ~Bit;
2844 return (DocDiagsExactEnabled & Bit) != 0;
2854 StringRef MagicMarkerText;
2857 MagicMarkerText =
"///<";
2860 MagicMarkerText =
"/**<";
2865 Diag(Comment.
getBegin(), diag::warn_splice_in_doxygen_comment);
2868 llvm_unreachable(
"if this is an almost Doxygen comment, "
2869 "it should be ordinary");
2871 Diag(Comment.
getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
2879char ExternalSemaSource::ID;
2889 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {}
2900 bool IsMemExpr =
false;
2910 Overloads = dyn_cast<UnresolvedMemberExpr>(E.
IgnoreParens());
2919 DeclsEnd = Overloads->
decls_end(); it != DeclsEnd; ++it) {
2927 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
2928 if (OverloadDecl->getMinRequiredArguments() == 0) {
2930 (!IsMV || !(OverloadDecl->isCPUDispatchMultiVersion() ||
2931 OverloadDecl->isCPUSpecificMultiVersion()))) {
2935 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
2936 IsMV = OverloadDecl->isCPUDispatchMultiVersion() ||
2937 OverloadDecl->isCPUSpecificMultiVersion();
2945 return !ZeroArgCallReturnTy.
isNull();
2956 ZeroArgCallReturnTy = R.get()->getType();
2962 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E.
IgnoreParens())) {
2963 if (
const auto *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
2964 if (Fun->getMinRequiredArguments() == 0)
2965 ZeroArgCallReturnTy = Fun->getReturnType();
2974 QualType PointeeTy = ExprTy->getPointeeType();
2980 if (
const auto *FPT = dyn_cast_if_present<FunctionProtoType>(FunTy)) {
2981 if (FPT->getNumParams() == 0)
3002 unsigned ShownOverloads = 0;
3003 unsigned SuppressedOverloads = 0;
3005 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
3007 ++SuppressedOverloads;
3011 const NamedDecl *Fn = (*It)->getUnderlyingDecl();
3013 if (
const auto *FD = Fn->getAsFunction()) {
3015 !FD->
getAttr<TargetAttr>()->isDefaultVersion())
3018 !FD->
getAttr<TargetVersionAttr>()->isDefaultVersion())
3021 S.
Diag(Fn->getLocation(), diag::note_possible_target_of_call);
3027 if (SuppressedOverloads)
3028 S.
Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
3029 << SuppressedOverloads;
3034 bool (*IsPlausibleResult)(
QualType)) {
3035 if (!IsPlausibleResult)
3040 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
3042 QualType OverloadResultTy = OverloadDecl->getReturnType();
3043 if (IsPlausibleResult(OverloadResultTy))
3044 PlausibleOverloads.
addDecl(It.getDecl());
3062 if (
const auto *UO = dyn_cast<UnaryOperator>(E))
3063 E = UO->getSubExpr();
3065 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3066 if (ULE->getNumDecls() == 0)
3069 const NamedDecl *ND = *ULE->decls_begin();
3070 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
3078 bool (*IsPlausibleResult)(
QualType)) {
3088 !ZeroArgCallTy.
isNull() &&
3089 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
3096 Diag(Loc, PD) << 1 << IsMV << Range
3107 Range.getEnd().getLocWithOffset(1));
3111 if (!ForceComplain)
return false;
3114 Diag(Loc, PD) << 0 << IsMV << Range;
3123 Ident_super = &
Context.Idents.get(
"super");
3129 unsigned OpenMPCaptureLevel) {
3133 ?
OpenMP().getOpenMPNestingLevel()
3135 OpenMPCaptureLevel);
3136 CSI->ReturnType =
Context.VoidTy;
3148const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
3156 OldEvalMethod(S.
PP.getCurrentFPEvalMethod()),
3157 OldFPPragmaLocation(S.
PP.getLastFPEvalPragmaLocation()) {}
3160 S.CurFPFeatures = OldFPFeaturesState;
3161 S.FpPragmaStack.CurrentValue = OldOverrides;
3162 S.PP.setCurrentFPEvalMethod(OldFPPragmaLocation, OldEvalMethod);
3167 "can only be called for qualified names");
3177 bool Result = llvm::all_of(LR, [](
Decl *Dcl) {
3178 if (
NamedDecl *ND = dyn_cast<NamedDecl>(Dcl)) {
3179 ND = ND->getUnderlyingDecl();
3191 auto *A = AnnotateAttr::Create(
Context, Annot, Args.data(), Args.size(), CI);
3208 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.
Result
Implement __builtin_bit_cast and related operations.
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.
TypePropertyCache< Private > Cache
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual ASTMutationListener * GetASTMutationListener()
If the consumer is interested in entities getting modified after their initial creation,...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
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.
Represents a C++26 expansion statement declaration.
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
bool isSet() const
Deprecated.
Represents the body of a CapturedStmt, and serves as its DeclContext.
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
static const char * getCastKindName(CastKind CK)
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
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
FriendSpecified isFriendSpecified() const
Decl - This represents one declaration (or definition), e.g.
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.
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.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
SourceLocation getBeginLoc() const LLVM_READONLY
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
const IdentifierInfo * getIdentifier() const
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 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.
Level
The level of the diagnostic, after it has been through mapping.
bool hasFatalErrorOccurred() 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...
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.
RAII class that temporarily forces warnings in system headers and system macros to be shown on a Diag...
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
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...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isDeleted() const
Whether this function has been deleted.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
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.
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.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
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::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.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
static const unsigned NumNSNumberLiteralMethods
This represents a decl that may have a name.
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
NamedDecl * getMostRecentDecl()
bool isExternallyVisible() const
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.
UnresolvedSetImpl::iterator decls_iterator
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.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
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
bool hasUninitializedExplicitInitFields() const
Represents the body of a requires-expression.
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()).
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
static bool isImplicitHDExplicitInstantiation(const FunctionDecl *FD)
Null-tolerant wrapper for FunctionDecl::isImplicitHDExplicitInstantiation.
llvm::DenseMap< CanonicalDeclPtr< const FunctionDecl >, llvm::SmallVector< FunctionDeclAndLoc, 1 > > DeviceKnownEmittedFns
An inverse call graph, mapping known-emitted functions to their known-emitted callers (plus the locat...
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 ActOnEndOfTranslationUnit(TranslationUnitDecl *TU)
void DiagnoseUnterminatedOpenMPDeclareTarget()
Report unterminated 'omp declare target' or 'omp begin declare target' at the end of a compilation un...
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 determine whether SFINAE has trapped any errors that occur during template argumen...
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.
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Scope * getCurScope() const
Retrieve the parser's current scope.
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
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....
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
OpaquePtr< QualType > TypeTy
void addImplicitTypedef(StringRef Name, QualType T)
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void emitAndClearUnusedLocalTypedefWarnings()
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
bool areDocumentationDiagsEnabled(SourceLocation Loc)
Returns true if any of the documentation warnings is enabled at Loc.
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
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...
void clearDocumentationDiagsCache()
Discard the areDocumentationDiagsEnabled() cache, for when a #pragma clang diagnostic has changed dia...
Preprocessor & getPreprocessor() const
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
PragmaStack< FPOptionsOverride > FpPragmaStack
PragmaStack< StringLiteral * > CodeSegStack
void setFunctionHasBranchIntoScope()
void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver)
If VD is set but not otherwise used, diagnose, for a parameter or a variable.
void ActOnComment(SourceRange Comment)
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
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()
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
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.
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
PragmaStack< bool > StrictGuardStackCheckStack
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
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
PragmaStack< StringLiteral * > ConstSegStack
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.
unsigned TyposCorrected
The number of typos corrected by CorrectTypo.
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
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.
void setFunctionHasIndirectGoto()
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
void PushFunctionScope()
Enter a new function scope.
FPOptions & getCurFPFeatures()
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
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()
api_notes::APINotesManager APINotes
const LangOptions & getLangOpts() const
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
ASTConsumer & getASTConsumer() const
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
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
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
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.
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
bool shouldRetainCommentsInAST(SourceLocation Loc)
Returns true if a comment at Loc should be retained in the AST (some consumer such as -Wdocumentation...
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)
PragmaStack< AlignPackInfo > AlignPackStack
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...
PragmaStack< StringLiteral * > BSSSegStack
DeclContext * getCurLexicalContext() const
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...
sema::FunctionScopeInfo * getCurFunction() const
void PushCompoundScope(bool IsStmtExpr)
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
llvm::MapVector< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
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)
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
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 GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
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.
CanThrowResult canThrow(const Stmt *E)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
PragmaStack< MSVtorDispMode > VtorDispStack
Whether to insert vtordisps prior to virtual bases in the Microsoft C++ ABI.
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
bool isSFINAEContext() const
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
void setFunctionHasMustTail()
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
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.
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
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.
LateTemplateParserCB * LateTemplateParser
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.
llvm::SmallPtrSet< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
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()
void LoadExternalExtnameUndeclaredIdentifiers()
Load pragma redefine_extname'd undeclared identifiers from the external source.
PragmaStack< StringLiteral * > DataSegStack
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.
bool isMainFileLoc(SourceLocation Loc) const
Determines whether the given source location is in the main file and we're in a context where we shou...
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.
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
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.
void getSortedUnusedLocalTypedefNameCandidates(SmallVectorImpl< const TypedefNameDecl * > &Sorted) const
Store UnusedLocalTypedefNameCandidates in Sorted in a deterministic order.
void DiagnoseUnusedAPINotesSelectors()
Diagnose exact API notes selectors that were not matched by any declaration processed in this transla...
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.
llvm::DenseSet< InstantiatingSpecializationsKey > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
ASTMutationListener * getASTMutationListener() const
SFINAETrap * getSFINAEContext() const
Returns a pointer to the current SFINAE context, if any.
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.
UIntTy getRawEncoding() const
When a SourceLocation itself cannot be used, this returns an (opaque) 32-bit integer encoding for it.
This class handles loading and caching of source files into memory.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
FileID getMainFileID() const
Returns the FileID of the main source file.
SourceLocation getIncludeLoc(FileID FID) const
Returns the include location if FID is a #include'd file otherwise it returns an invalid location.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
void setEnd(SourceLocation e)
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.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool hasAMDGPUTypes() const
Returns whether or not the AMDGPU built-in types are available on this target.
virtual bool hasFPReturn() const
Determine whether return of a floating point value is supported on this target.
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...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
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
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 isOverflowBehaviorType() 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
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
Base class for declarations which introduce a typedef-name.
A set of unresolved declarations.
UnresolvedSetIterator iterator
void addDecl(NamedDecl *D)
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 * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isInternalLinkageFileVar() const
Returns true if this is a file-scope variable with internal linkage.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
const Expr * getInit() const
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
@ TLS_None
Not a TLS variable.
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.
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.
Provides information about an attempted template argument deduction, whose success or failure was des...
void addSuppressedDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Add a new diagnostic to the set of diagnostics.
void addSFINAEDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Set the diagnostic which caused the SFINAE failure.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
Defines the clang::TargetInfo interface.
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.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
void threadSafetyCleanup(BeforeSet *Cache)
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
@ ExpectedVariableOrFunction
@ Nullable
Values of this type can be null.
@ NonNull
Values of this type can never be null.
DiagStateSystemClass
Whether a source location is in a system header and/or a system macro.
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...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
void inferNoReturnAttr(Sema &S, Decl *D)
@ Undefined
Keep undefined.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ Result
The result type of a method or function.
const FunctionProtoType * T
@ 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_Complete
The translation unit is a complete translation unit.
@ 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.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
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.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
bool isExternalFormalLinkage(Linkage L)
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
@ 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)
ActionResult< Expr * > ExprResult
CheckedConversionKind
The kind of conversion being performed.
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
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<=>.
Information from a C++ pragma export, for a symbol that we haven't seen the declaration for yet.