From 804f4953d2936bf7076e8445f909d2cb544e785c Mon Sep 17 00:00:00 2001 From: Lars Schumann Date: Thu, 9 Apr 2026 16:31:12 +0000 Subject: [PATCH] constify Index(Mut), Deref(Mut) for Vec --- library/alloc/src/lib.rs | 1 + library/alloc/src/vec/mod.rs | 12 ++++++++---- tests/ui/consts/issue-94675.rs | 3 +-- tests/ui/consts/issue-94675.stderr | 20 ++++++-------------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index 344b46f01b75..d85a63999fe0 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -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)] diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 5a0f6d3dc571..b633beae8913 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -3747,7 +3747,8 @@ unsafe fn spec_extend_from_within(&mut self, src: Range) { //////////////////////////////////////////////////////////////////////////////// #[stable(feature = "rust1", since = "1.0.0")] -impl ops::Deref for Vec { +#[rustc_const_unstable(feature = "const_convert", issue = "143773")] +impl const ops::Deref for Vec { type Target = [T]; #[inline] @@ -3757,7 +3758,8 @@ fn deref(&self) -> &[T] { } #[stable(feature = "rust1", since = "1.0.0")] -impl ops::DerefMut for Vec { +#[rustc_const_unstable(feature = "const_convert", issue = "143773")] +impl const ops::DerefMut for Vec { #[inline] fn deref_mut(&mut self) -> &mut [T] { self.as_mut_slice() @@ -3822,7 +3824,8 @@ fn hash(&self, state: &mut H) { } #[stable(feature = "rust1", since = "1.0.0")] -impl, A: Allocator> Index for Vec { +#[rustc_const_unstable(feature = "const_index", issue = "143775")] +impl, A: Allocator> const Index for Vec { type Output = I::Output; #[inline] @@ -3832,7 +3835,8 @@ fn index(&self, index: I) -> &Self::Output { } #[stable(feature = "rust1", since = "1.0.0")] -impl, A: Allocator> IndexMut for Vec { +#[rustc_const_unstable(feature = "const_index", issue = "143775")] +impl, A: Allocator> const IndexMut for Vec { #[inline] fn index_mut(&mut self, index: I) -> &mut Self::Output { IndexMut::index_mut(&mut **self, index) diff --git a/tests/ui/consts/issue-94675.rs b/tests/ui/consts/issue-94675.rs index 0553b676bc3e..73ab2c765580 100644 --- a/tests/ui/consts/issue-94675.rs +++ b/tests/ui/consts/issue-94675.rs @@ -9,8 +9,7 @@ struct Foo<'a> { impl<'a> Foo<'a> { const fn spam(&mut self, baz: &mut Vec) { self.bar[0] = baz.len(); - //~^ ERROR: `Vec: [const] Index<_>` is not satisfied - //~| ERROR: `Vec: [const] IndexMut` is not satisfied + //~^ ERROR: `IndexMut` is not yet stable as a const trait } } diff --git a/tests/ui/consts/issue-94675.stderr b/tests/ui/consts/issue-94675.stderr index ab7a76a90e02..3e89e37814fa 100644 --- a/tests/ui/consts/issue-94675.stderr +++ b/tests/ui/consts/issue-94675.stderr @@ -1,21 +1,13 @@ -error[E0277]: the trait bound `Vec: [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: [const] IndexMut` 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`.