about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKirill Podoprigora <kirill.bast9@mail.ru>2025-03-12 00:35:16 +0200
committerKirill Podoprigora <kirill.bast9@mail.ru>2025-03-12 00:35:16 +0200
commit7398b39a0bfae6c778379b46f2d9e957c94f4f0d (patch)
tree5a678eb8bd4ef6fbd220f95ac4062ac64d7a2979
parent64d143326f222ef477044d846e7e8f09ac6d6a3a (diff)
downloadrust-7398b39a0bfae6c778379b46f2d9e957c94f4f0d.tar.gz
rust-7398b39a0bfae6c778379b46f2d9e957c94f4f0d.zip
Make panic's more specific
-rw-r--r--compiler/rustc_index/src/slice.rs23
1 files changed, 13 insertions, 10 deletions
diff --git a/compiler/rustc_index/src/slice.rs b/compiler/rustc_index/src/slice.rs
index 6e28d1ccf27..1f19d8c66f0 100644
--- a/compiler/rustc_index/src/slice.rs
+++ b/compiler/rustc_index/src/slice.rs
@@ -1,6 +1,7 @@
 use std::fmt;
 use std::marker::PhantomData;
 use std::ops::{Index, IndexMut};
+use std::slice::GetDisjointMutError::*;
 use std::slice::{self, SliceIndex};
 
 use crate::{Idx, IndexVec, IntoSliceIdx};
@@ -115,33 +116,35 @@ impl<I: Idx, T> IndexSlice<I, T> {
 
     /// Returns mutable references to two distinct elements, `a` and `b`.
     ///
-    /// Panics if `a == b`.
+    /// Panics if `a == b` or if some of them are out of bounds.
     #[inline]
     pub fn pick2_mut(&mut self, a: I, b: I) -> (&mut T, &mut T) {
         let (ai, bi) = (a.index(), b.index());
-        assert!(ai != bi);
-        let len = self.raw.len();
-        assert!(ai < len && bi < len);
 
         match self.raw.get_disjoint_mut([ai, bi]) {
             Ok([a, b]) => (a, b),
-            Err(_) => panic!("Can't get mutable references"),
+            Err(OverlappingIndices) => panic!("Indices {ai:?} and {bi:?} are not disjoint!"),
+            Err(IndexOutOfBounds) => {
+                panic!("Some indices among ({ai:?}, {bi:?}) are out of bounds")
+            }
         }
     }
 
     /// Returns mutable references to three distinct elements.
     ///
-    /// Panics if the elements are not distinct.
+    /// Panics if the elements are not distinct or if some of them are out of bounds.
     #[inline]
     pub fn pick3_mut(&mut self, a: I, b: I, c: I) -> (&mut T, &mut T, &mut T) {
         let (ai, bi, ci) = (a.index(), b.index(), c.index());
-        assert!(ai != bi && bi != ci && ci != ai);
-        let len = self.raw.len();
-        assert!(ai < len && bi < len && ci < len);
 
         match self.raw.get_disjoint_mut([ai, bi, ci]) {
             Ok([a, b, c]) => (a, b, c),
-            Err(_) => panic!("Can't get mutable references"),
+            Err(OverlappingIndices) => {
+                panic!("Indices {ai:?}, {bi:?} and {ci:?} are not disjoint!")
+            }
+            Err(IndexOutOfBounds) => {
+                panic!("Some indices among ({ai:?}, {bi:?}, {ci:?}) are out of bounds")
+            }
         }
     }