Open-source lifetime inference/verification code.

PiperOrigin-RevId: 450954978
diff --git a/lifetime_analysis/lifetime_lattice.h b/lifetime_analysis/lifetime_lattice.h
new file mode 100644
index 0000000..68e8a0e
--- /dev/null
+++ b/lifetime_analysis/lifetime_lattice.h
@@ -0,0 +1,74 @@
+// Part of the Crubit project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef DEVTOOLS_RUST_CC_INTEROP_LIFETIME_ANALYSIS_LIFETIME_LATTICE_H_
+#define DEVTOOLS_RUST_CC_INTEROP_LIFETIME_ANALYSIS_LIFETIME_LATTICE_H_
+
+#include <string>
+#include <utility>
+#include <variant>
+
+#include "lifetime_analysis/points_to_map.h"
+#include "clang/Analysis/FlowSensitive/DataflowAnalysis.h"
+#include "clang/Analysis/FlowSensitive/DataflowLattice.h"
+#include "llvm/ADT/StringRef.h"
+
+namespace clang {
+namespace tidy {
+namespace lifetimes {
+
+class LifetimeLattice {
+ public:
+  // Creates a lattice holding an empty points-to map.
+  LifetimeLattice() = default;
+
+  LifetimeLattice(const LifetimeLattice&) = default;
+  LifetimeLattice(LifetimeLattice&&) = default;
+  LifetimeLattice& operator=(const LifetimeLattice&) = default;
+  LifetimeLattice& operator=(LifetimeLattice&&) = default;
+
+  // Creates a lattice containing the given points-to map.
+  explicit LifetimeLattice(PointsToMap points_to_map)
+      : var_(std::move(points_to_map)) {}
+
+  // Creates an error state containing the error message `err`.
+  explicit LifetimeLattice(std::string err) : var_(err) {}
+
+  // Returns the points-to map.
+  // Precondition: !IsError().
+  PointsToMap& PointsTo();
+  const PointsToMap& PointsTo() const;
+
+  // Returns whether the lattice is in the error state.
+  bool IsError() const { return std::holds_alternative<std::string>(var_); }
+
+  // Returns the error string.
+  // Precondition: IsError().
+  llvm::StringRef Error() const;
+
+  // Returns a human-readable representation of the lattice.
+  std::string ToString() const;
+
+  // Sets the lattice to the result of the "join" operation with `other` and
+  // returns the effect of the operation.
+  // If either of the lattices contains an error, sets this lattice to the
+  // first error encountered.
+  clang::dataflow::LatticeJoinEffect join(const LifetimeLattice& other);
+
+  // Compares for (in-)equality.
+  // All error states are considered to be equal.
+  bool operator==(const LifetimeLattice& other) const;
+  bool operator!=(const LifetimeLattice& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  std::variant<PointsToMap, std::string> var_;
+};
+
+}  // namespace lifetimes
+}  // namespace tidy
+}  // namespace clang
+
+#endif  // DEVTOOLS_RUST_CC_INTEROP_LIFETIME_ANALYSIS_LIFETIME_LATTICE_H_