Lines Matching refs:Path
226 IndirectLocalPath &Path;
227 unsigned OldSize = Path.size();
228 RevertToOldSizeRAII(IndirectLocalPath &Path) : Path(Path) {}
229 ~RevertToOldSizeRAII() { Path.resize(OldSize); }
232 using LocalVisitor = llvm::function_ref<bool(IndirectLocalPath &Path, Local L,
236 static bool isVarOnPath(const IndirectLocalPath &Path, VarDecl *VD) {
237 for (auto E : Path)
243 static bool pathContainsInit(const IndirectLocalPath &Path) {
244 return llvm::any_of(Path, [=](IndirectLocalPathEntry E) {
250 static void visitLocalsRetainedByInitializer(IndirectLocalPath &Path,
254 static void visitLocalsRetainedByReferenceBinding(IndirectLocalPath &Path,
561 static void visitFunctionCallArguments(IndirectLocalPath &Path, Expr *Call,
588 Path.push_back({IndirectLocalPathEntry::LifetimeBoundCall, Arg, D});
590 visitLocalsRetainedByReferenceBinding(Path, Arg, RK_ReferenceBinding,
593 visitLocalsRetainedByInitializer(Path, Arg, Visit, true);
594 Path.pop_back();
603 for (const IndirectLocalPathEntry &PE : llvm::reverse(Path)) {
613 Path.push_back({ReturnType->isReferenceType()
618 visitLocalsRetainedByReferenceBinding(Path, Arg, RK_ReferenceBinding,
621 visitLocalsRetainedByInitializer(Path, Arg, Visit, true);
622 Path.pop_back();
655 RevertToOldSizeRAII RAII(Path);
657 Path.push_back(
698 static void visitLocalsRetainedByReferenceBinding(IndirectLocalPath &Path,
701 RevertToOldSizeRAII RAII(Path);
718 Path.push_back(
740 return visitLocalsRetainedByInitializer(Path, Init, Visit, true);
746 Path.push_back(
753 if (Visit(Path, Local(MTE), RK))
754 visitLocalsRetainedByInitializer(Path, MTE->getSubExpr(), Visit, true);
761 visitLocalsRetainedByInitializer(Path, M->getBase(), Visit, true);
765 return visitFunctionCallArguments(Path, Init, Visit);
776 Visit(Path, Local(DRE), RK);
781 } else if (VD->getInit() && !isVarOnPath(Path, VD)) {
782 Path.push_back({IndirectLocalPathEntry::VarInit, DRE, VD});
783 visitLocalsRetainedByReferenceBinding(Path, VD->getInit(),
796 visitLocalsRetainedByInitializer(Path, U->getSubExpr(), Visit, true);
802 Path, cast<ArraySectionExpr>(Init)->getBase(), Visit, true);
810 visitLocalsRetainedByReferenceBinding(Path, C->getTrueExpr(), RK, Visit);
812 visitLocalsRetainedByReferenceBinding(Path, C->getFalseExpr(), RK, Visit);
819 Visit(Path, Local(CLE), RK);
833 static void visitLocalsRetainedByInitializer(IndirectLocalPath &Path,
836 RevertToOldSizeRAII RAII(Path);
845 Path.push_back(
867 Path.push_back({IndirectLocalPathEntry::LValToRVal, CE});
869 Path, Init, RK_ReferenceBinding,
870 [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {
874 !isVarOnPath(Path, VD)) {
875 Path.push_back({IndirectLocalPathEntry::VarInit, DRE, VD});
876 visitLocalsRetainedByInitializer(Path, VD->getInit(), Visit,
881 visitLocalsRetainedByInitializer(Path, MTE->getSubExpr(),
913 Path.push_back({IndirectLocalPathEntry::AddressOf, CE});
915 Path, CE->getSubExpr(), RK_ReferenceBinding, Visit);
929 return visitLocalsRetainedByReferenceBinding(Path, ILE->getSubExpr(),
940 return visitLocalsRetainedByInitializer(Path, ILE->getInit(0), Visit,
945 visitLocalsRetainedByInitializer(Path, ILE->getInit(I), Visit,
958 visitLocalsRetainedByReferenceBinding(Path, ILE->getInit(0),
963 visitLocalsRetainedByInitializer(Path, ILE->getInit(Index), Visit,
972 visitLocalsRetainedByReferenceBinding(Path, SubInit,
978 visitLocalsRetainedByInitializer(Path, SubInit, Visit,
997 Path.push_back({IndirectLocalPathEntry::LambdaCaptureInit, E, &Cap});
999 visitLocalsRetainedByReferenceBinding(Path, E, RK_ReferenceBinding,
1002 visitLocalsRetainedByInitializer(Path, E, Visit, true);
1004 Path.pop_back();
1014 Path.push_back({IndirectLocalPathEntry::TemporaryCopy, Arg,
1016 visitLocalsRetainedByInitializer(Path, Arg, Visit, true);
1017 Path.pop_back();
1023 return visitFunctionCallArguments(Path, Init, Visit);
1026 RevertToOldSizeRAII RAII(Path);
1027 Path.push_back({IndirectLocalPathEntry::ParenAggInit, CPE});
1030 visitLocalsRetainedByReferenceBinding(Path, I, RK_ReferenceBinding,
1033 visitLocalsRetainedByInitializer(Path, I, Visit, true);
1048 Path.push_back({IndirectLocalPathEntry::AddressOf, UO});
1049 visitLocalsRetainedByReferenceBinding(Path, UO->getSubExpr(),
1063 visitLocalsRetainedByInitializer(Path, BO->getLHS(), Visit, true);
1065 visitLocalsRetainedByInitializer(Path, BO->getRHS(), Visit, true);
1075 visitLocalsRetainedByInitializer(Path, C->getTrueExpr(), Visit, true);
1077 visitLocalsRetainedByInitializer(Path, C->getFalseExpr(), Visit, true);
1084 Visit(Path, Local(cast<BlockExpr>(Init)), RK_ReferenceBinding);
1090 Visit(Path, Local(cast<AddrLabelExpr>(Init)), RK_ReferenceBinding);
1109 shouldLifetimeExtendThroughPath(const IndirectLocalPath &Path) {
1110 for (auto Elem : Path) {
1122 static SourceRange nextPathEntryRange(const IndirectLocalPath &Path, unsigned I,
1124 for (unsigned N = Path.size(); I != N; ++I) {
1125 switch (Path[I].Kind) {
1140 if (cast<VarDecl>(Path[I].D)->isImplicit())
1144 return Path[I].E->getSourceRange();
1147 if (!Path[I].Capture->capturesVariable())
1149 return Path[I].E->getSourceRange();
1152 return cast<CXXDefaultArgExpr>(Path[I].E)->getUsedLocation();
1158 static bool pathOnlyHandlesGslPointer(const IndirectLocalPath &Path) {
1159 for (const auto &It : llvm::reverse(Path)) {
1176 // Result of analyzing the Path for GSLPointer.
1178 // Path does not correspond to a GSLPointer.
1190 static AnalysisResult analyzePathForGSLPointer(const IndirectLocalPath &Path,
1192 if (!pathOnlyHandlesGslPointer(Path))
1195 // At this point, Path represents a series of operations involving a
1199 for (const auto &E : Path) {
1202 if (pathContainsInit(Path))
1223 // The "Path" is [GSLPointerInit, LifetimeboundCall], where "L" is the
1226 if (Path.back().Kind == IndirectLocalPathEntry::LifetimeBoundCall) {
1229 llvm::dyn_cast_or_null<FunctionDecl>(Path.back().D);
1231 if (const auto *PD = llvm::dyn_cast<ParmVarDecl>(Path.back().D))
1258 if (!pathContainsInit(Path) && isRecordWithAttr<OwnerAttr>(L->getType()))
1308 auto TemporaryVisitor = [&](const IndirectLocalPath &Path, Local L,
1310 SourceRange DiagRange = nextPathEntryRange(Path, 0, L);
1316 switch (analyzePathForGSLPointer(Path, L, LK)) {
1348 switch (shouldLifetimeExtendThroughPath(Path)) {
1361 if (pathContainsInit(Path))
1388 if (!MTE || pathContainsInit(Path))
1415 SemaRef.Diag(DiagLoc, shouldLifetimeExtendThroughPath(Path) !=
1423 if (Path.empty() ||
1424 Path.back().Kind != IndirectLocalPathEntry::DefaultInit) {
1442 if (pathContainsInit(Path))
1534 for (unsigned I = 0; I != Path.size(); ++I) {
1535 auto Elem = Path[I];
1558 << FD << nextPathEntryRange(Path, I + 1, L);
1566 << VD->getDeclName() << nextPathEntryRange(Path, I + 1, L);
1580 << nextPathEntryRange(Path, I + 1, L);
1589 << Param << nextPathEntryRange(Path, I + 1, L);
1600 llvm::SmallVector<IndirectLocalPathEntry, 8> Path;
1604 Path.push_back(
1613 Path.push_back({IndirectLocalPathEntry::GslPointerInit, Init});
1621 visitLocalsRetainedByReferenceBinding(Path, Init, RK_ReferenceBinding,
1625 Path, Init, TemporaryVisitor,