Auto merge of #135609 - cuviper:beta-next, r=cuviper
[beta] backports - do not in-place-iterate over flatmap/flatten #135104 - Make sure to mark `IMPL_TRAIT_REDUNDANT_CAPTURES` as `Allow` in edition 2024 #135441 - Update to LLVM 19.1.7 #135484 r? cuviper
This commit is contained in:
commit
752fecf800
6 changed files with 39 additions and 64 deletions
|
|
@ -99,7 +99,7 @@ declare_lint! {
|
|||
/// To fix this, remove the `use<'a>`, since the lifetime is already captured
|
||||
/// since it is in scope.
|
||||
pub IMPL_TRAIT_REDUNDANT_CAPTURES,
|
||||
Warn,
|
||||
Allow,
|
||||
"redundant precise-capturing `use<...>` syntax on an `impl Trait`",
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1204,22 +1204,16 @@ fn test_from_iter_specialization_with_iterator_adapters() {
|
|||
#[test]
|
||||
fn test_in_place_specialization_step_up_down() {
|
||||
fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {}
|
||||
let src = vec![[0u8; 4]; 256];
|
||||
let srcptr = src.as_ptr();
|
||||
let src_cap = src.capacity();
|
||||
let iter = src.into_iter().flatten();
|
||||
assert_in_place_trait(&iter);
|
||||
let sink = iter.collect::<Vec<_>>();
|
||||
let sinkptr = sink.as_ptr();
|
||||
assert_eq!(srcptr as *const u8, sinkptr);
|
||||
assert_eq!(src_cap * 4, sink.capacity());
|
||||
|
||||
let iter = sink.into_iter().array_chunks::<4>();
|
||||
let src = vec![0u8; 1024];
|
||||
let srcptr = src.as_ptr();
|
||||
let src_bytes = src.capacity();
|
||||
let iter = src.into_iter().array_chunks::<4>();
|
||||
assert_in_place_trait(&iter);
|
||||
let sink = iter.collect::<Vec<_>>();
|
||||
let sinkptr = sink.as_ptr();
|
||||
assert_eq!(srcptr, sinkptr);
|
||||
assert_eq!(src_cap, sink.capacity());
|
||||
assert_eq!(srcptr.addr(), sinkptr.addr());
|
||||
assert_eq!(src_bytes, sink.capacity() * 4);
|
||||
|
||||
let mut src: Vec<u8> = Vec::with_capacity(17);
|
||||
let src_bytes = src.capacity();
|
||||
|
|
@ -1236,13 +1230,6 @@ fn test_in_place_specialization_step_up_down() {
|
|||
let sink: Vec<[u8; 2]> = iter.collect();
|
||||
assert_eq!(sink.len(), 8);
|
||||
assert!(sink.capacity() <= 25);
|
||||
|
||||
let src = vec![[0u8; 4]; 256];
|
||||
let srcptr = src.as_ptr();
|
||||
let iter = src.into_iter().flat_map(|a| a.into_iter().map(|b| b.wrapping_add(1)));
|
||||
assert_in_place_trait(&iter);
|
||||
let sink = iter.collect::<Vec<_>>();
|
||||
assert_eq!(srcptr as *const u8, sink.as_ptr());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -1350,6 +1337,20 @@ fn test_collect_after_iterator_clone() {
|
|||
assert_eq!(v, [1, 1, 1, 1, 1]);
|
||||
assert!(v.len() <= v.capacity());
|
||||
}
|
||||
|
||||
// regression test for #135103, similar to the one above Flatten/FlatMap had an unsound InPlaceIterable
|
||||
// implementation.
|
||||
#[test]
|
||||
fn test_flatten_clone() {
|
||||
const S: String = String::new();
|
||||
|
||||
let v = vec![[S, "Hello World!".into()], [S, S]];
|
||||
let mut i = v.into_iter().flatten();
|
||||
let _ = i.next();
|
||||
let result: Vec<String> = i.clone().collect();
|
||||
assert_eq!(result, ["Hello World!", "", ""]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cow_from() {
|
||||
let borrowed: &[_] = &["borrowed", "(slice)"];
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use crate::iter::adapters::SourceIter;
|
||||
use crate::iter::{
|
||||
Cloned, Copied, Empty, Filter, FilterMap, Fuse, FusedIterator, InPlaceIterable, Map, Once,
|
||||
OnceWith, TrustedFused, TrustedLen,
|
||||
Cloned, Copied, Empty, Filter, FilterMap, Fuse, FusedIterator, Map, Once, OnceWith,
|
||||
TrustedFused, TrustedLen,
|
||||
};
|
||||
use crate::num::NonZero;
|
||||
use crate::ops::{ControlFlow, Try};
|
||||
|
|
@ -157,21 +157,6 @@ where
|
|||
{
|
||||
}
|
||||
|
||||
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||
unsafe impl<I, U, F> InPlaceIterable for FlatMap<I, U, F>
|
||||
where
|
||||
I: InPlaceIterable,
|
||||
U: BoundedSize + IntoIterator,
|
||||
{
|
||||
const EXPAND_BY: Option<NonZero<usize>> = const {
|
||||
match (I::EXPAND_BY, U::UPPER_BOUND) {
|
||||
(Some(m), Some(n)) => m.checked_mul(n),
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
|
||||
}
|
||||
|
||||
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||
unsafe impl<I, U, F> SourceIter for FlatMap<I, U, F>
|
||||
where
|
||||
|
|
@ -386,21 +371,6 @@ where
|
|||
{
|
||||
}
|
||||
|
||||
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||
unsafe impl<I> InPlaceIterable for Flatten<I>
|
||||
where
|
||||
I: InPlaceIterable + Iterator,
|
||||
<I as Iterator>::Item: IntoIterator + BoundedSize,
|
||||
{
|
||||
const EXPAND_BY: Option<NonZero<usize>> = const {
|
||||
match (I::EXPAND_BY, I::Item::UPPER_BOUND) {
|
||||
(Some(m), Some(n)) => m.checked_mul(n),
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
|
||||
}
|
||||
|
||||
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||
unsafe impl<I> SourceIter for Flatten<I>
|
||||
where
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 59512b00273829823da74050d373b8d46dbca558
|
||||
Subproject commit 7e8c93c87c611f21d9bd95100563392f4c18bfe7
|
||||
|
|
@ -1,24 +1,24 @@
|
|||
//@ edition: 2024
|
||||
//@ check-pass
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
#![deny(impl_trait_redundant_captures)]
|
||||
|
||||
fn hello<'a>() -> impl Sized + use<'a> {}
|
||||
//~^ WARN all possible in-scope parameters are already captured
|
||||
//~^ ERROR all possible in-scope parameters are already captured
|
||||
|
||||
struct Inherent;
|
||||
impl Inherent {
|
||||
fn inherent(&self) -> impl Sized + use<'_> {}
|
||||
//~^ WARN all possible in-scope parameters are already captured
|
||||
//~^ ERROR all possible in-scope parameters are already captured
|
||||
}
|
||||
|
||||
trait Test<'a> {
|
||||
fn in_trait() -> impl Sized + use<'a, Self>;
|
||||
//~^ WARN all possible in-scope parameters are already captured
|
||||
//~^ ERROR all possible in-scope parameters are already captured
|
||||
}
|
||||
impl<'a> Test<'a> for () {
|
||||
fn in_trait() -> impl Sized + use<'a> {}
|
||||
//~^ WARN all possible in-scope parameters are already captured
|
||||
//~^ ERROR all possible in-scope parameters are already captured
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:6:19
|
||||
|
|
||||
LL | fn hello<'a>() -> impl Sized + use<'a> {}
|
||||
|
|
@ -6,9 +6,13 @@ LL | fn hello<'a>() -> impl Sized + use<'a> {}
|
|||
| |
|
||||
| help: remove the `use<...>` syntax
|
||||
|
|
||||
= note: `#[warn(impl_trait_redundant_captures)]` on by default
|
||||
note: the lint level is defined here
|
||||
--> $DIR/redundant.rs:4:9
|
||||
|
|
||||
LL | #![deny(impl_trait_redundant_captures)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:11:27
|
||||
|
|
||||
LL | fn inherent(&self) -> impl Sized + use<'_> {}
|
||||
|
|
@ -16,7 +20,7 @@ LL | fn inherent(&self) -> impl Sized + use<'_> {}
|
|||
| |
|
||||
| help: remove the `use<...>` syntax
|
||||
|
||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:16:22
|
||||
|
|
||||
LL | fn in_trait() -> impl Sized + use<'a, Self>;
|
||||
|
|
@ -24,7 +28,7 @@ LL | fn in_trait() -> impl Sized + use<'a, Self>;
|
|||
| |
|
||||
| help: remove the `use<...>` syntax
|
||||
|
||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:20:22
|
||||
|
|
||||
LL | fn in_trait() -> impl Sized + use<'a> {}
|
||||
|
|
@ -32,5 +36,5 @@ LL | fn in_trait() -> impl Sized + use<'a> {}
|
|||
| |
|
||||
| help: remove the `use<...>` syntax
|
||||
|
||||
warning: 4 warnings emitted
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue