Rollup merge of #80834 - bugadani:vecdeque, r=oli-obk
Remove unreachable panics from VecDeque::{front/back}[_mut] `VecDeque`'s `front`, `front_mut`, `back` and `back_mut` methods are implemented in terms of the index operator, which causes these functions to contain [unreachable panic calls](https://rust.godbolt.org/z/MTnq1o). This PR reimplements these methods in terms of `get[_mut]` instead.
This commit is contained in:
commit
1b8fd02daa
2 changed files with 23 additions and 5 deletions
|
@ -1292,7 +1292,7 @@ impl<T> VecDeque<T> {
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn front(&self) -> Option<&T> {
|
pub fn front(&self) -> Option<&T> {
|
||||||
if !self.is_empty() { Some(&self[0]) } else { None }
|
self.get(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Provides a mutable reference to the front element, or `None` if the
|
/// Provides a mutable reference to the front element, or `None` if the
|
||||||
|
@ -1316,7 +1316,7 @@ impl<T> VecDeque<T> {
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn front_mut(&mut self) -> Option<&mut T> {
|
pub fn front_mut(&mut self) -> Option<&mut T> {
|
||||||
if !self.is_empty() { Some(&mut self[0]) } else { None }
|
self.get_mut(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Provides a reference to the back element, or `None` if the `VecDeque` is
|
/// Provides a reference to the back element, or `None` if the `VecDeque` is
|
||||||
|
@ -1336,7 +1336,7 @@ impl<T> VecDeque<T> {
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn back(&self) -> Option<&T> {
|
pub fn back(&self) -> Option<&T> {
|
||||||
if !self.is_empty() { Some(&self[self.len() - 1]) } else { None }
|
self.get(self.len().wrapping_sub(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Provides a mutable reference to the back element, or `None` if the
|
/// Provides a mutable reference to the back element, or `None` if the
|
||||||
|
@ -1360,8 +1360,7 @@ impl<T> VecDeque<T> {
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn back_mut(&mut self) -> Option<&mut T> {
|
pub fn back_mut(&mut self) -> Option<&mut T> {
|
||||||
let len = self.len();
|
self.get_mut(self.len().wrapping_sub(1))
|
||||||
if !self.is_empty() { Some(&mut self[len - 1]) } else { None }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Removes the first element and returns it, or `None` if the `VecDeque` is
|
/// Removes the first element and returns it, or `None` if the `VecDeque` is
|
||||||
|
|
19
src/test/codegen/vecdeque_no_panic.rs
Normal file
19
src/test/codegen/vecdeque_no_panic.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// This test checks that `VecDeque::front[_mut]()` and `VecDeque::back[_mut]()` can't panic.
|
||||||
|
|
||||||
|
// compile-flags: -O
|
||||||
|
// ignore-debug: the debug assertions get in the way
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
// CHECK-LABEL: @dont_panic
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn dont_panic(v: &mut VecDeque<usize>) {
|
||||||
|
// CHECK-NOT: expect
|
||||||
|
// CHECK-NOT: panic
|
||||||
|
v.front();
|
||||||
|
v.front_mut();
|
||||||
|
v.back();
|
||||||
|
v.back_mut();
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue