From cbc94349d0ba20d6781cd3892794db55e630922a Mon Sep 17 00:00:00 2001 From: Trevor Gross Date: Fri, 27 Mar 2026 09:31:38 +0000 Subject: [PATCH 1/2] core: Destabilize beta-stable `RangeInclusiveIter::remainder` As discussed, make this portion of the range API unstable again. This will now be tracked under `new_range_remainder`. Discussion: https://rust-lang.zulipchat.com/#narrow/channel/327149-t-libs-api.2Fapi-changes/topic/.60RangeFrom.3A.3Aremainder.60.20possible.20panic/with/582108913 --- library/core/src/range/iter.rs | 5 ++++- tests/ui/range/new_range_stability.rs | 2 +- tests/ui/range/new_range_stability.stderr | 12 +++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/library/core/src/range/iter.rs b/library/core/src/range/iter.rs index 0cddfff4022d..e2795ebaadad 100644 --- a/library/core/src/range/iter.rs +++ b/library/core/src/range/iter.rs @@ -175,7 +175,10 @@ impl RangeInclusiveIter { /// If the iterator is exhausted or empty, returns `None`. /// /// # Examples + /// /// ``` + /// #![feature(new_range_remainder)] + /// /// let range = core::range::RangeInclusive::from(3..=11); /// let mut iter = range.into_iter(); /// assert_eq!(iter.clone().remainder().unwrap(), range); @@ -184,7 +187,7 @@ impl RangeInclusiveIter { /// iter.by_ref().for_each(drop); /// assert!(iter.remainder().is_none()); /// ``` - #[stable(feature = "new_range_inclusive_api", since = "1.95.0")] + #[unstable(feature = "new_range_remainder", issue = "154458")] pub fn remainder(self) -> Option> { if self.0.is_empty() { return None; diff --git a/tests/ui/range/new_range_stability.rs b/tests/ui/range/new_range_stability.rs index 0b2965ecba23..71a0f02e5896 100644 --- a/tests/ui/range/new_range_stability.rs +++ b/tests/ui/range/new_range_stability.rs @@ -19,7 +19,7 @@ fn range_inclusive(mut r: RangeInclusive) { let mut i = r.into_iter(); i.next(); - i.remainder(); + i.remainder(); //~ ERROR unstable } fn range_to_inclusive(mut r: RangeToInclusive) { diff --git a/tests/ui/range/new_range_stability.stderr b/tests/ui/range/new_range_stability.stderr index 747c39d001eb..8a6dd5cac11e 100644 --- a/tests/ui/range/new_range_stability.stderr +++ b/tests/ui/range/new_range_stability.stderr @@ -28,6 +28,16 @@ LL | use std::range::RangeIter; = help: add `#![feature(new_range_api)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date +error[E0658]: use of unstable library feature `new_range_remainder` + --> $DIR/new_range_stability.rs:22:7 + | +LL | i.remainder(); + | ^^^^^^^^^ + | + = note: see issue #154458 for more information + = help: add `#![feature(new_range_remainder)]` to the crate attributes to enable + = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date + error[E0658]: use of unstable library feature `new_range_api` --> $DIR/new_range_stability.rs:43:7 | @@ -38,6 +48,6 @@ LL | i.remainder(); = help: add `#![feature(new_range_api)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date -error: aborting due to 4 previous errors +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0658`. From 0bb3fe315e2130ce5229462d44ccc0ff09c41a4c Mon Sep 17 00:00:00 2001 From: Trevor Gross Date: Fri, 27 Mar 2026 09:35:24 +0000 Subject: [PATCH 2/2] core: Move `{RangeIter, RangeFromIter}::remainder` to `new_range_remainder` Split the remainder functions from the rest of `std::range`. --- library/core/src/range/iter.rs | 11 ++++++++--- tests/codegen-llvm/fromrangeiter-overflow-checks.rs | 1 + tests/ui/iterators/rangefrom-overflow-debug.rs | 2 +- tests/ui/iterators/rangefrom-overflow-ndebug.rs | 2 +- .../iterators/rangefrom-overflow-overflow-checks.rs | 2 +- tests/ui/range/new_range_stability.stderr | 6 +++--- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/library/core/src/range/iter.rs b/library/core/src/range/iter.rs index e2795ebaadad..c29b498bd25f 100644 --- a/library/core/src/range/iter.rs +++ b/library/core/src/range/iter.rs @@ -11,12 +11,15 @@ pub struct RangeIter(legacy::Range); impl RangeIter { - #[unstable(feature = "new_range_api", issue = "125687")] + #[unstable(feature = "new_range_remainder", issue = "154458")] /// Returns the remainder of the range being iterated over. /// /// # Examples + /// /// ``` /// #![feature(new_range_api)] + /// #![feature(new_range_remainder)] + /// /// let range = core::range::Range::from(3..11); /// let mut iter = range.into_iter(); /// assert_eq!(iter.clone().remainder(), range); @@ -333,8 +336,10 @@ impl RangeFromIter { /// Returns the remainder of the range being iterated over. /// /// # Examples + /// /// ``` - /// #![feature(new_range_api)] + /// #![feature(new_range_remainder)] + /// /// let range = core::range::RangeFrom::from(3..); /// let mut iter = range.into_iter(); /// assert_eq!(iter.clone().remainder(), range); @@ -343,7 +348,7 @@ impl RangeFromIter { /// ``` #[inline] #[rustc_inherit_overflow_checks] - #[unstable(feature = "new_range_api", issue = "125687")] + #[unstable(feature = "new_range_remainder", issue = "154458")] pub fn remainder(self) -> RangeFrom { // Need to handle this case even if overflow-checks are disabled, // because a `RangeFromIter` could be exhausted in a crate with diff --git a/tests/codegen-llvm/fromrangeiter-overflow-checks.rs b/tests/codegen-llvm/fromrangeiter-overflow-checks.rs index 0d640178f459..8662a6456c8b 100644 --- a/tests/codegen-llvm/fromrangeiter-overflow-checks.rs +++ b/tests/codegen-llvm/fromrangeiter-overflow-checks.rs @@ -11,6 +11,7 @@ #![crate_type = "lib"] #![feature(new_range_api)] +#![feature(new_range_remainder)] use std::range::RangeFrom; diff --git a/tests/ui/iterators/rangefrom-overflow-debug.rs b/tests/ui/iterators/rangefrom-overflow-debug.rs index 9a1bc6910a04..7eafbadc62fb 100644 --- a/tests/ui/iterators/rangefrom-overflow-debug.rs +++ b/tests/ui/iterators/rangefrom-overflow-debug.rs @@ -2,7 +2,7 @@ //@ needs-unwind //@ compile-flags: -O -C debug_assertions=yes -#![feature(new_range_api)] +#![feature(new_range_remainder)] use std::panic; diff --git a/tests/ui/iterators/rangefrom-overflow-ndebug.rs b/tests/ui/iterators/rangefrom-overflow-ndebug.rs index 4ce9b0636383..f1a6301c50d9 100644 --- a/tests/ui/iterators/rangefrom-overflow-ndebug.rs +++ b/tests/ui/iterators/rangefrom-overflow-ndebug.rs @@ -1,7 +1,7 @@ //@ run-pass //@ compile-flags: -O -C debug_assertions=no -#![feature(new_range_api)] +#![feature(new_range_remainder)] fn main() { let mut it = core::range::RangeFrom::from(u8::MAX..).into_iter(); diff --git a/tests/ui/iterators/rangefrom-overflow-overflow-checks.rs b/tests/ui/iterators/rangefrom-overflow-overflow-checks.rs index 7e3b0fc30840..af432afacabb 100644 --- a/tests/ui/iterators/rangefrom-overflow-overflow-checks.rs +++ b/tests/ui/iterators/rangefrom-overflow-overflow-checks.rs @@ -2,7 +2,7 @@ //@ needs-unwind //@ compile-flags: -O -C overflow-checks=yes -#![feature(new_range_api)] +#![feature(new_range_remainder)] use std::panic; diff --git a/tests/ui/range/new_range_stability.stderr b/tests/ui/range/new_range_stability.stderr index 8a6dd5cac11e..64ef6a416687 100644 --- a/tests/ui/range/new_range_stability.stderr +++ b/tests/ui/range/new_range_stability.stderr @@ -38,14 +38,14 @@ LL | i.remainder(); = help: add `#![feature(new_range_remainder)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date -error[E0658]: use of unstable library feature `new_range_api` +error[E0658]: use of unstable library feature `new_range_remainder` --> $DIR/new_range_stability.rs:43:7 | LL | i.remainder(); | ^^^^^^^^^ | - = note: see issue #125687 for more information - = help: add `#![feature(new_range_api)]` to the crate attributes to enable + = note: see issue #154458 for more information + = help: add `#![feature(new_range_remainder)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date error: aborting due to 5 previous errors