From: Owen Avery <powerboat9.ga...@gmail.com>

Fixes PR#119641

gcc/rust/ChangeLog:

        * checks/errors/borrowck/rust-bir-place.h
        (IndexVec::size_type): Add.
        (IndexVec::MAX_INDEX): Add.
        (IndexVec::size): Change the return type to the type of the
        internal value used by the index type.
        (PlaceDB::lookup_or_add_variable): Use the return value from the
        PlaceDB::add_place call.
        * checks/errors/borrowck/rust-bir.h
        (struct BasicBlockId): Move this definition before the
        definition of the struct Function.

Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>
---
 .../checks/errors/borrowck/rust-bir-place.h   | 12 ++++--
 gcc/rust/checks/errors/borrowck/rust-bir.h    | 40 +++++++++----------
 2 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-place.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
index 67ca90b93d0..dd9e672f412 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-place.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
@@ -204,6 +204,9 @@ template <typename I, typename T> class IndexVec
 {
   std::vector<T> internal_vector;
 
+  typedef decltype (std::declval<I> ().value) size_type;
+  static constexpr auto MAX_INDEX = std::numeric_limits<size_type>::max ();
+
 public:
   IndexVec () = default;
   IndexVec (size_t size) { internal_vector.reserve (size); }
@@ -219,7 +222,11 @@ public:
     internal_vector.emplace_back (std::forward<Args> (args)...);
   }
 
-  size_t size () const { return internal_vector.size (); }
+  size_type size () const
+  {
+    rust_assert (internal_vector.size () < MAX_INDEX);
+    return static_cast<size_type> (internal_vector.size ());
+  }
 
   std::vector<T> &get_vector () { return internal_vector; }
 };
@@ -418,8 +425,7 @@ public:
     if (lookup != INVALID_PLACE)
       return lookup;
 
-    add_place ({Place::VARIABLE, id, {}, is_type_copy (tyty), tyty});
-    return {places.size () - 1};
+    return add_place ({Place::VARIABLE, id, {}, is_type_copy (tyty), tyty});
   };
 
   template <typename FN> void for_each_path_from_root (PlaceId var, FN fn) 
const
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir.h 
b/gcc/rust/checks/errors/borrowck/rust-bir.h
index e90e508a2c7..8a5f7bea3d9 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir.h
@@ -35,6 +35,26 @@ using BasicBlocks = IndexVec<BasicBlockId, BasicBlock>;
 class Statement;
 class AbstractExpr;
 
+/** Unique identifier for a basic block in the BIR. */
+struct BasicBlockId
+{
+  uint32_t value;
+  // some overloads for comparision
+  bool operator== (const BasicBlockId &rhs) const { return value == rhs.value; 
}
+  bool operator!= (const BasicBlockId &rhs) const
+  {
+    return !(operator== (rhs));
+  }
+  bool operator< (const BasicBlockId &rhs) const { return value < rhs.value; }
+  bool operator> (const BasicBlockId &rhs) const { return value > rhs.value; }
+  bool operator<= (const BasicBlockId &rhs) const { return !(operator> (rhs)); 
}
+  bool operator>= (const BasicBlockId &rhs) const { return !(operator< (rhs)); 
}
+};
+
+static constexpr BasicBlockId INVALID_BB
+  = {std::numeric_limits<uint32_t>::max ()};
+static constexpr BasicBlockId ENTRY_BASIC_BLOCK = {0};
+
 /**
  * Top-level entity of the Borrow-checker IR (BIR).
  * It represents a single function (method, closure, etc.), which is the
@@ -132,26 +152,6 @@ public:
   WARN_UNUSED_RESULT location_t get_location () const { return location; }
 };
 
-/** Unique identifier for a basic block in the BIR. */
-struct BasicBlockId
-{
-  uint32_t value;
-  // some overloads for comparision
-  bool operator== (const BasicBlockId &rhs) const { return value == rhs.value; 
}
-  bool operator!= (const BasicBlockId &rhs) const
-  {
-    return !(operator== (rhs));
-  }
-  bool operator< (const BasicBlockId &rhs) const { return value < rhs.value; }
-  bool operator> (const BasicBlockId &rhs) const { return value > rhs.value; }
-  bool operator<= (const BasicBlockId &rhs) const { return !(operator> (rhs)); 
}
-  bool operator>= (const BasicBlockId &rhs) const { return !(operator< (rhs)); 
}
-};
-
-static constexpr BasicBlockId INVALID_BB
-  = {std::numeric_limits<uint32_t>::max ()};
-static constexpr BasicBlockId ENTRY_BASIC_BLOCK = {0};
-
 struct BasicBlock
 {
   // BIR "instructions".
-- 
2.49.0

Reply via email to