Rollup merge of #155054 - Lars-Schumann:const-vec-ops, r=dtolnay

constify `Index(Mut)`, `Deref(Mut)` for `Vec`

Relevant tracking issues
const_convert: https://github.com/rust-lang/rust/issues/143773
const_index: https://github.com/rust-lang/rust/issues/143775
This commit is contained in:
Jonathan Brouwer
2026-04-20 08:14:09 +02:00
committed by GitHub
4 changed files with 16 additions and 20 deletions
+1
View File
@@ -106,6 +106,7 @@
#![feature(const_destruct)]
#![feature(const_eval_select)]
#![feature(const_heap)]
#![feature(const_index)]
#![feature(const_option_ops)]
#![feature(const_try)]
#![feature(copied_into_inner)]
+8 -4
View File
@@ -3747,7 +3747,8 @@ unsafe fn spec_extend_from_within(&mut self, src: Range<usize>) {
////////////////////////////////////////////////////////////////////////////////
#[stable(feature = "rust1", since = "1.0.0")]
impl<T, A: Allocator> ops::Deref for Vec<T, A> {
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
impl<T, A: Allocator> const ops::Deref for Vec<T, A> {
type Target = [T];
#[inline]
@@ -3757,7 +3758,8 @@ fn deref(&self) -> &[T] {
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T, A: Allocator> ops::DerefMut for Vec<T, A> {
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
impl<T, A: Allocator> const ops::DerefMut for Vec<T, A> {
#[inline]
fn deref_mut(&mut self) -> &mut [T] {
self.as_mut_slice()
@@ -3822,7 +3824,8 @@ fn hash<H: Hasher>(&self, state: &mut H) {
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T, I: SliceIndex<[T]>, A: Allocator> Index<I> for Vec<T, A> {
#[rustc_const_unstable(feature = "const_index", issue = "143775")]
impl<T, I: [const] SliceIndex<[T]>, A: Allocator> const Index<I> for Vec<T, A> {
type Output = I::Output;
#[inline]
@@ -3832,7 +3835,8 @@ fn index(&self, index: I) -> &Self::Output {
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T, I: SliceIndex<[T]>, A: Allocator> IndexMut<I> for Vec<T, A> {
#[rustc_const_unstable(feature = "const_index", issue = "143775")]
impl<T, I: [const] SliceIndex<[T]>, A: Allocator> const IndexMut<I> for Vec<T, A> {
#[inline]
fn index_mut(&mut self, index: I) -> &mut Self::Output {
IndexMut::index_mut(&mut **self, index)
+1 -2
View File
@@ -9,8 +9,7 @@ struct Foo<'a> {
impl<'a> Foo<'a> {
const fn spam(&mut self, baz: &mut Vec<u32>) {
self.bar[0] = baz.len();
//~^ ERROR: `Vec<usize>: [const] Index<_>` is not satisfied
//~| ERROR: `Vec<usize>: [const] IndexMut<usize>` is not satisfied
//~^ ERROR: `IndexMut` is not yet stable as a const trait
}
}
+6 -14
View File
@@ -1,21 +1,13 @@
error[E0277]: the trait bound `Vec<usize>: [const] Index<_>` is not satisfied
--> $DIR/issue-94675.rs:11:9
error: `IndexMut` is not yet stable as a const trait
--> $DIR/issue-94675.rs:11:17
|
LL | self.bar[0] = baz.len();
| ^^^^^^^^^^^
| ^^^
|
note: trait `Index` is implemented but not `const`
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
error[E0277]: the trait bound `Vec<usize>: [const] IndexMut<usize>` is not satisfied
--> $DIR/issue-94675.rs:11:9
help: add `#![feature(const_index)]` to the crate attributes to enable
|
LL | self.bar[0] = baz.len();
| ^^^^^^^^^^^
LL + #![feature(const_index)]
|
note: trait `IndexMut` is implemented but not `const`
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
error: aborting due to 2 previous errors
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0277`.