================
@@ -0,0 +1,108 @@
+
+#include "clang/Analysis/Analyses/LifetimeSafety/MovedLoans.h"
+#include "Dataflow.h"
+#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
+#include "clang/Analysis/Analyses/LifetimeSafety/LoanPropagation.h"
+#include "clang/Analysis/Analyses/LifetimeSafety/Loans.h"
+#include "clang/Analysis/Analyses/LifetimeSafety/Utils.h"
+
+namespace clang::lifetimes::internal {
+namespace {
+struct Lattice {
+  MovedLoansMap MovedLoans = MovedLoansMap(nullptr);
+
+  explicit Lattice(MovedLoansMap MovedLoans) : MovedLoans(MovedLoans) {}
+
+  Lattice() = default;
+
+  bool operator==(const Lattice &Other) const {
+    return MovedLoans == Other.MovedLoans;
+  }
+  bool operator!=(const Lattice &Other) const { return !(*this == Other); }
+};
+
+class AnalysisImpl
+    : public DataflowAnalysis<AnalysisImpl, Lattice, Direction::Forward> {
+public:
+  AnalysisImpl(const CFG &C, AnalysisDeclContext &AC, FactManager &F,
+               const LoanPropagationAnalysis &LoanPropagation,
+               const LoanManager &LoanMgr,
+               MovedLoansMap::Factory &MovedLoansMapFactory)
+      : DataflowAnalysis(C, AC, F), LoanPropagation(LoanPropagation),
+        LoanMgr(LoanMgr), MovedLoansMapFactory(MovedLoansMapFactory) {}
+
+  using Base::transfer;
+
+  StringRef getAnalysisName() const { return "MovedLoans"; }
+
+  Lattice getInitialState() { return Lattice{}; }
+
+  // TODO: Doc.
+  Lattice join(Lattice A, Lattice B) {
+    MovedLoansMap MovedLoans = utils::join(
+        A.MovedLoans, B.MovedLoans, MovedLoansMapFactory,
+        [](const Expr *const *MoveA, const Expr *const *MoveB) -> const Expr * 
{
+          assert(MoveA || MoveB);
+          if (!MoveA)
+            return *MoveB;
+          if (!MoveB)
+            return *MoveA;
+          return (*MoveA)->getExprLoc() < (*MoveB)->getExprLoc() ? *MoveA
+                                                                 : *MoveB;
+        },
+        utils::JoinKind::Asymmetric);
+    return Lattice(MovedLoans);
+  }
+
+  Lattice transfer(Lattice In, const MovedOriginFact &F) {
+    MovedLoansMap MovedLoans = In.MovedLoans;
+    OriginID MovedOrigin = F.getMovedOrigin();
+    LoanSet ImmediatelyMovedLoans = LoanPropagation.getLoans(MovedOrigin, &F);
+    FactMgr.forAllPredecessors(&F, [&](const Fact *PF) {
----------------
Xazax-hun wrote:

I see. I still sort of dislike this backtracking. Do you think it would be 
easier to iterate through all the live loans at this point and check if their 
path matches?

https://github.com/llvm/llvm-project/pull/178670
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to