]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix narrowing conversion warnings
authorOwen Avery <powerboat9.gamer@gmail.com>
Thu, 17 Apr 2025 02:53:18 +0000 (22:53 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 28 Apr 2025 14:19:30 +0000 (16:19 +0200)
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.gamer@gmail.com>
gcc/rust/checks/errors/borrowck/rust-bir-place.h
gcc/rust/checks/errors/borrowck/rust-bir.h

index 67ca90b93d02c695fd31843de9dbdc6803ef6cd2..dd9e672f41208b858edcdaeb188017cb2163a9ad 100644 (file)
@@ -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
index e90e508a2c71993dbc353be0f2f0f090fa1774dc..8a5f7bea3d9a0b899ad17c41029538a05170f8b3 100644 (file)
@@ -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".