Rollup merge of #141072 - Rynibami:stabilize-const-result-flatten, r=jhpratt

Stabilize feature `result_flattening`

Stabilizes the `Result::flatten` method

## Implementations

- [x] Implementation `Result::flatten`: https://github.com/rust-lang/rust/pull/70140
- [x] Implementation `const` `Result::flatten`: https://github.com/rust-lang/rust/pull/130692
- [x] Update stabilization attribute macros (this PR)

## Stabilization process

- [x] Created this PR [suggested](https://github.com/rust-lang/rust/issues/70142#issuecomment-2885044548) by ``@RalfJung``
- [x] FCP (haven't found any, is it applicable here?)
- [ ] Close issue rust-lang/rust#70142
This commit is contained in:
Jacob Pratt 2025-06-01 00:35:50 +02:00 committed by GitHub
commit 241ec137fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 13 additions and 17 deletions

View file

@ -12,7 +12,6 @@
#![feature(decl_macro)]
#![feature(panic_backtrace_config)]
#![feature(panic_update_hook)]
#![feature(result_flattening)]
#![feature(rustdoc_internals)]
#![feature(try_blocks)]
// tidy-alphabetical-end

View file

@ -1722,7 +1722,6 @@ impl<T, E> Result<Result<T, E>, E> {
/// # Examples
///
/// ```
/// #![feature(result_flattening)]
/// let x: Result<Result<&'static str, u32>, u32> = Ok(Ok("hello"));
/// assert_eq!(Ok("hello"), x.flatten());
///
@ -1736,14 +1735,14 @@ impl<T, E> Result<Result<T, E>, E> {
/// Flattening only removes one level of nesting at a time:
///
/// ```
/// #![feature(result_flattening)]
/// let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok("hello")));
/// assert_eq!(Ok(Ok("hello")), x.flatten());
/// assert_eq!(Ok("hello"), x.flatten().flatten());
/// ```
#[inline]
#[unstable(feature = "result_flattening", issue = "70142")]
#[rustc_const_unstable(feature = "result_flattening", issue = "70142")]
#[stable(feature = "result_flattening", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
#[rustc_const_stable(feature = "result_flattening", since = "CURRENT_RUSTC_VERSION")]
pub const fn flatten(self) -> Result<T, E> {
// FIXME(const-hack): could be written with `and_then`
match self {

View file

@ -1,5 +1,5 @@
#![warn(clippy::map_flatten)]
#![feature(result_flattening)]
//@no-rustfix
// issue #8506, multi-line
#[rustfmt::skip]

View file

@ -1,4 +1,3 @@
#![feature(result_flattening)]
#![allow(
clippy::let_underscore_untyped,
clippy::missing_docs_in_private_items,

View file

@ -1,4 +1,3 @@
#![feature(result_flattening)]
#![allow(
clippy::let_underscore_untyped,
clippy::missing_docs_in_private_items,

View file

@ -1,5 +1,5 @@
error: called `map(..).flatten()` on `Iterator`
--> tests/ui/map_flatten_fixable.rs:17:47
--> tests/ui/map_flatten_fixable.rs:16:47
|
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id).flatten().collect();
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(option_id)`
@ -8,43 +8,43 @@ LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id).flatten().coll
= help: to override `-D warnings` add `#[allow(clippy::map_flatten)]`
error: called `map(..).flatten()` on `Iterator`
--> tests/ui/map_flatten_fixable.rs:19:47
--> tests/ui/map_flatten_fixable.rs:18:47
|
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id_ref).flatten().collect();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(option_id_ref)`
error: called `map(..).flatten()` on `Iterator`
--> tests/ui/map_flatten_fixable.rs:21:47
--> tests/ui/map_flatten_fixable.rs:20:47
|
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(option_id_closure).flatten().collect();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(option_id_closure)`
error: called `map(..).flatten()` on `Iterator`
--> tests/ui/map_flatten_fixable.rs:23:47
--> tests/ui/map_flatten_fixable.rs:22:47
|
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(|x| x.checked_add(1)).flatten().collect();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `filter_map` and remove the `.flatten()`: `filter_map(|x| x.checked_add(1))`
error: called `map(..).flatten()` on `Iterator`
--> tests/ui/map_flatten_fixable.rs:27:47
--> tests/ui/map_flatten_fixable.rs:26:47
|
LL | let _: Vec<_> = vec![5_i8; 6].into_iter().map(|x| 0..x).flatten().collect();
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `flat_map` and remove the `.flatten()`: `flat_map(|x| 0..x)`
error: called `map(..).flatten()` on `Option`
--> tests/ui/map_flatten_fixable.rs:31:40
--> tests/ui/map_flatten_fixable.rs:30:40
|
LL | let _: Option<_> = (Some(Some(1))).map(|x| x).flatten();
| ^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `and_then` and remove the `.flatten()`: `and_then(|x| x)`
error: called `map(..).flatten()` on `Result`
--> tests/ui/map_flatten_fixable.rs:35:42
--> tests/ui/map_flatten_fixable.rs:34:42
|
LL | let _: Result<_, &str> = (Ok(Ok(1))).map(|x| x).flatten();
| ^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `and_then` and remove the `.flatten()`: `and_then(|x| x)`
error: called `map(..).flatten()` on `Iterator`
--> tests/ui/map_flatten_fixable.rs:45:10
--> tests/ui/map_flatten_fixable.rs:44:10
|
LL | .map(|n| match n {
| __________^
@ -74,7 +74,7 @@ LL ~ });
|
error: called `map(..).flatten()` on `Option`
--> tests/ui/map_flatten_fixable.rs:66:10
--> tests/ui/map_flatten_fixable.rs:65:10
|
LL | .map(|_| {
| __________^