From: Kushal Pal <kushalpal...@gmail.com>

gcc/rust/ChangeLog:

        * checks/errors/borrowck/rust-bir-dump.cc (Dump::visit): Use new
        API, i.e get_loan_id() instead of get_loan().
        * checks/errors/borrowck/rust-bir-fact-collector.h (points): Use
        value of LoanId in Polonius facts.
        * checks/errors/borrowck/rust-bir-place.h (struct LoanId):
        LoanId is a struct now.
        * checks/errors/borrowck/rust-bir.h (class AbstractExpr): Use
        new API, as we are getting a LoanId and not a loan itself.

Signed-off-by: Kushal Pal <kushalpal...@gmail.com>
---
 .../checks/errors/borrowck/rust-bir-dump.cc   |  2 +-
 .../errors/borrowck/rust-bir-fact-collector.h | 44 +++++++++----------
 .../checks/errors/borrowck/rust-bir-place.h   | 20 ++++++++-
 gcc/rust/checks/errors/borrowck/rust-bir.h    |  4 +-
 4 files changed, 42 insertions(+), 28 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc 
b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
index e69c0002b3c..85ba3ee2ce4 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
@@ -279,7 +279,7 @@ Dump::visit (const BorrowExpr &expr)
 {
   stream << "&"
         << "'?" << expr.get_origin () << " ";
-  if (func.place_db.get_loans ()[expr.get_loan ()].mutability
+  if (func.place_db.get_loan (expr.get_loan_id ()).mutability
       == Mutability::Mut)
     stream << "mut ";
   visit_place (expr.get_place ());
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
index ebf8eec7053..774f2b9e298 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
@@ -305,7 +305,7 @@ protected: // Main collection entry points (for different 
categories).
     rust_debug ("\t_%u = BorrowExpr(_%u)", lhs.value - 1,
                expr.get_place ().value - 1);
 
-    auto loan = place_db.get_loans ()[expr.get_loan ()];
+    auto loan = place_db.get_loan (expr.get_loan_id ());
 
     auto &base_place = place_db[expr.get_place ()];
     auto &ref_place = place_db[lhs];
@@ -324,14 +324,14 @@ protected: // Main collection entry points (for different 
categories).
                   ->is_mutable ())
              rust_error_at (location,
                             "Cannot reborrow immutable borrow as mutable");
-           issue_loan (expr.get_origin (), expr.get_loan ());
+           issue_loan (expr.get_origin (), expr.get_loan_id ());
          }
 
        push_subset (main_loan_place.regions[0], {expr.get_origin ()});
       }
     else
       {
-       issue_loan (expr.get_origin (), expr.get_loan ());
+       issue_loan (expr.get_origin (), expr.get_loan_id ());
       }
 
     auto loan_regions = base_place.regions.prepend ({expr.get_origin ()});
@@ -511,24 +511,25 @@ protected: // Generic BIR operations.
 
   void issue_loan (Polonius::Origin origin, LoanId loan_id)
   {
-    facts.loan_issued_at.emplace_back (origin, loan_id,
+    facts.loan_issued_at.emplace_back (origin, loan_id.value,
                                       get_current_point_mid ());
 
-    check_for_borrow_conficts (place_db.get_loans ()[loan_id].place, loan_id,
-                              place_db.get_loans ()[loan_id].mutability);
+    check_for_borrow_conficts (place_db.get_loan (loan_id).place, loan_id,
+                              place_db.get_loan (loan_id).mutability);
   }
 
   void issue_locals_dealloc ()
   {
-    for (LoanId loan_id = 0; loan_id < place_db.get_loans ().size (); 
++loan_id)
+    for (LoanId loan_id = {0}; loan_id.value < place_db.get_loans ().size ();
+        ++loan_id.value)
       {
-       auto &loan = place_db.get_loans ()[loan_id];
+       auto &loan = place_db.get_loan (loan_id);
        auto loaned_var_id = place_db.get_var (loan.place);
        if (place_db[loaned_var_id].tyty->is<TyTy::ReferenceType> ())
          continue;
        if (loaned_var_id >= first_local)
          facts.loan_invalidated_at.emplace_back (get_current_point_start (),
-                                                 loan_id);
+                                                 loan_id.value);
       }
   }
 
@@ -546,20 +547,20 @@ protected: // Generic BIR operations.
     place_db.for_each_path_segment (place_id, [&] (PlaceId id) {
       for (auto loan : place_db[id].borrowed_by)
        {
-         if (place_db.get_loans ()[loan].mutability == Mutability::Mut)
+         if (place_db.get_loan (loan).mutability == Mutability::Mut)
            {
              facts.loan_invalidated_at.emplace_back (
-               get_current_point_start (), loan);
+               get_current_point_start (), loan.value);
            }
        }
     });
     place_db.for_each_path_from_root (place_id, [&] (PlaceId id) {
       for (auto loan : place_db[id].borrowed_by)
        {
-         if (place_db.get_loans ()[loan].mutability == Mutability::Mut)
+         if (place_db.get_loan (loan).mutability == Mutability::Mut)
            {
              facts.loan_invalidated_at.emplace_back (
-               get_current_point_start (), loan);
+               get_current_point_start (), loan.value);
            }
        }
     });
@@ -570,12 +571,12 @@ protected: // Generic BIR operations.
     place_db.for_each_path_segment (place_id, [&] (PlaceId id) {
       for (auto loan : place_db[id].borrowed_by)
        facts.loan_invalidated_at.emplace_back (get_current_point_start (),
-                                               loan);
+                                               loan.value);
     });
     place_db.for_each_path_from_root (place_id, [&] (PlaceId id) {
       for (auto loan : place_db[id].borrowed_by)
        facts.loan_invalidated_at.emplace_back (get_current_point_start (),
-                                               loan);
+                                               loan.value);
     });
   }
 
@@ -586,12 +587,11 @@ protected: // Generic BIR operations.
       for (auto other_loan : place_db[id].borrowed_by)
        {
          if (mutability == Mutability::Imm
-             && place_db.get_loans ()[other_loan].mutability
-                  == Mutability::Imm)
+             && place_db.get_loan (other_loan).mutability == Mutability::Imm)
            continue;
          else
            facts.loan_invalidated_at.emplace_back (get_current_point_start (),
-                                                   other_loan);
+                                                   other_loan.value);
        }
     });
 
@@ -599,12 +599,11 @@ protected: // Generic BIR operations.
       for (auto other_loan : place_db[id].borrowed_by)
        {
          if (mutability == Mutability::Imm
-             && place_db.get_loans ()[other_loan].mutability
-                  == Mutability::Imm)
+             && place_db.get_loan (other_loan).mutability == Mutability::Imm)
            continue;
          else
            facts.loan_invalidated_at.emplace_back (get_current_point_start (),
-                                                   other_loan);
+                                                   other_loan.value);
        }
     });
   }
@@ -626,7 +625,8 @@ protected: // Generic BIR operations.
       {
        // TODO: this is more complicated, see
        // compiler/rustc_borrowck/src/constraint_generation.rs:176
-       facts.loan_killed_at.emplace_back (loan, get_current_point_mid ());
+       facts.loan_killed_at.emplace_back (loan.value,
+                                          get_current_point_mid ());
       }
   }
 
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-place.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
index 6a5a5b45919..c78492a2394 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-place.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
@@ -49,7 +49,19 @@ static constexpr PlaceId RETURN_VALUE_PLACE = {1};
 static constexpr PlaceId FIRST_VARIABLE_PLACE = RETURN_VALUE_PLACE;
 
 using Variance = TyTy::VarianceAnalysis::Variance;
-using LoanId = uint32_t;
+
+/** A unique identifier for a loan in the BIR. */
+struct LoanId
+{
+  uint32_t value;
+  // some overloads for comparision
+  bool operator== (const LoanId &rhs) const { return value == rhs.value; }
+  bool operator!= (const LoanId &rhs) const { return !(operator== (rhs)); }
+  bool operator< (const LoanId &rhs) const { return value < rhs.value; }
+  bool operator> (const LoanId &rhs) const { return value > rhs.value; }
+  bool operator<= (const LoanId &rhs) const { return !(operator> (rhs)); }
+  bool operator>= (const LoanId &rhs) const { return !(operator< (rhs)); }
+};
 
 /**
  * Representation of lvalues and constants in BIR.
@@ -207,6 +219,10 @@ public:
   size_t size () const { return places.size (); }
 
   const std::vector<Loan> &get_loans () const { return loans; }
+  const Loan &get_loan (LoanId loan_id) const
+  {
+    return loans.at (loan_id.value);
+  }
 
   ScopeId get_current_scope_id () const { return current_scope; }
 
@@ -332,7 +348,7 @@ public:
 
   LoanId add_loan (Loan &&loan)
   {
-    LoanId id = loans.size ();
+    LoanId id = {loans.size ()};
     loans.push_back (std::forward<Loan &&> (loan));
     PlaceId borrowed_place = loans.rbegin ()->place;
     places[loans.rbegin ()->place.value].borrowed_by.push_back (id);
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir.h 
b/gcc/rust/checks/errors/borrowck/rust-bir.h
index e8b7e39c550..192e4452551 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir.h
@@ -33,8 +33,6 @@ struct BasicBlock;
 class Statement;
 class AbstractExpr;
 
-using LoanId = uint32_t;
-
 /**
  * Top-level entity of the Borrow-checker IR (BIR).
  * It represents a single function (method, closure, etc.), which is the
@@ -225,7 +223,7 @@ public:
       loan (loan_id), origin (lifetime)
   {}
   WARN_UNUSED_RESULT PlaceId get_place () const { return place; }
-  WARN_UNUSED_RESULT LoanId get_loan () const { return loan; }
+  WARN_UNUSED_RESULT LoanId get_loan_id () const { return loan; }
   WARN_UNUSED_RESULT Polonius::Origin get_origin () const { return origin; }
 };
 
-- 
2.45.2

Reply via email to