Skip to content

Commit 082c861

Browse files
committed
Auto merge of #58644 - Centril:rollup, r=Centril
Rollup of 17 pull requests Successful merges: - #57656 (Deprecate the unstable Vec::resize_default) - #58059 (deprecate before_exec in favor of unsafe pre_exec) - #58064 (override `VecDeque::try_rfold`, also update iterator) - #58198 (Suggest removing parentheses surrounding lifetimes) - #58431 (fix overlapping references in BTree) - #58555 (Add a note about 2018e if someone uses `try {` in 2015e) - #58588 (remove a bit of dead code) - #58589 (cleanup macro after 2018 transition) - #58591 (Dedup a rustdoc diagnostic construction) - #58600 (fix small documentation typo) - #58601 (Search for target_triple.json only if builtin target not found) - #58606 (Docs: put Future trait into spotlight) - #58607 (Fixes #58586: Make E0505 erronous example fail for the 2018 edition) - #58615 (miri: explain why we use static alignment in ref-to-place conversion) - #58620 (introduce benchmarks of BTreeSet.intersection) - #58621 (Update miri links) - #58632 (Make std feature list sorted) Failed merges: r? @ghost
2 parents e1c6d00 + a8a343a commit 082c861

File tree

29 files changed

+542
-210
lines changed

29 files changed

+542
-210
lines changed

CONTRIBUTING.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,10 @@ it can be found [here][rctd].
161161

162162
Currently building Rust will also build the following external projects:
163163

164-
* [clippy](https://github.com/rust-lang-nursery/rust-clippy)
165-
* [miri](https://github.com/solson/miri)
166-
* [rustfmt](https://github.com/rust-lang-nursery/rustfmt)
167-
* [rls](https://github.com/rust-lang-nursery/rls/)
164+
* [clippy](https://github.com/rust-lang/rust-clippy)
165+
* [miri](https://github.com/rust-lang/miri)
166+
* [rustfmt](https://github.com/rust-lang/rustfmt)
167+
* [rls](https://github.com/rust-lang/rls/)
168168

169169
We allow breakage of these tools in the nightly channel. Maintainers of these
170170
projects will be notified of the breakages and should fix them as soon as
@@ -191,9 +191,9 @@ before the PR is merged.
191191

192192
Rust's build system builds a number of tools that make use of the
193193
internals of the compiler. This includes
194-
[Clippy](https://github.com/rust-lang-nursery/rust-clippy),
195-
[RLS](https://github.com/rust-lang-nursery/rls) and
196-
[rustfmt](https://github.com/rust-lang-nursery/rustfmt). If these tools
194+
[Clippy](https://github.com/rust-lang/rust-clippy),
195+
[RLS](https://github.com/rust-lang/rls) and
196+
[rustfmt](https://github.com/rust-lang/rustfmt). If these tools
197197
break because of your changes, you may run into a sort of "chicken and egg"
198198
problem. These tools rely on the latest compiler to be built so you can't update
199199
them to reflect your changes to the compiler until those changes are merged into
@@ -253,10 +253,10 @@ to complete a few more steps which are outlined with their rationale below.
253253

254254
*(This error may change in the future to include more information.)*
255255
```
256-
error: failed to resolve patches for `https://github.com/rust-lang-nursery/rustfmt`
256+
error: failed to resolve patches for `https://github.com/rust-lang/rustfmt`
257257
258258
Caused by:
259-
patch for `rustfmt-nightly` in `https://github.com/rust-lang-nursery/rustfmt` did not resolve to any crates
259+
patch for `rustfmt-nightly` in `https://github.com/rust-lang/rustfmt` did not resolve to any crates
260260
failed to run: ~/rust/build/x86_64-unknown-linux-gnu/stage0/bin/cargo build --manifest-path ~/rust/src/bootstrap/Cargo.toml
261261
```
262262

src/doc/rustdoc/src/documentation-tests.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ disambiguate the error type:
244244
/// use std::io;
245245
/// let mut input = String::new();
246246
/// io::stdin().read_line(&mut input)?;
247-
/// # Ok::<(), io:Error>(())
247+
/// # Ok::<(), io::Error>(())
248248
/// ```
249249
```
250250

src/liballoc/benches/btree/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
mod map;
2+
mod set;

src/liballoc/benches/btree/set.rs

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
use std::collections::BTreeSet;
2+
3+
use rand::{thread_rng, Rng};
4+
use test::{black_box, Bencher};
5+
6+
fn random(n1: u32, n2: u32) -> [BTreeSet<usize>; 2] {
7+
let mut rng = thread_rng();
8+
let mut set1 = BTreeSet::new();
9+
let mut set2 = BTreeSet::new();
10+
for _ in 0..n1 {
11+
let i = rng.gen::<usize>();
12+
set1.insert(i);
13+
}
14+
for _ in 0..n2 {
15+
let i = rng.gen::<usize>();
16+
set2.insert(i);
17+
}
18+
[set1, set2]
19+
}
20+
21+
fn staggered(n1: u32, n2: u32) -> [BTreeSet<u32>; 2] {
22+
let mut even = BTreeSet::new();
23+
let mut odd = BTreeSet::new();
24+
for i in 0..n1 {
25+
even.insert(i * 2);
26+
}
27+
for i in 0..n2 {
28+
odd.insert(i * 2 + 1);
29+
}
30+
[even, odd]
31+
}
32+
33+
fn neg_vs_pos(n1: u32, n2: u32) -> [BTreeSet<i32>; 2] {
34+
let mut neg = BTreeSet::new();
35+
let mut pos = BTreeSet::new();
36+
for i in -(n1 as i32)..=-1 {
37+
neg.insert(i);
38+
}
39+
for i in 1..=(n2 as i32) {
40+
pos.insert(i);
41+
}
42+
[neg, pos]
43+
}
44+
45+
fn pos_vs_neg(n1: u32, n2: u32) -> [BTreeSet<i32>; 2] {
46+
let mut neg = BTreeSet::new();
47+
let mut pos = BTreeSet::new();
48+
for i in -(n1 as i32)..=-1 {
49+
neg.insert(i);
50+
}
51+
for i in 1..=(n2 as i32) {
52+
pos.insert(i);
53+
}
54+
[pos, neg]
55+
}
56+
57+
macro_rules! set_intersection_bench {
58+
($name: ident, $sets: expr) => {
59+
#[bench]
60+
pub fn $name(b: &mut Bencher) {
61+
// setup
62+
let sets = $sets;
63+
64+
// measure
65+
b.iter(|| {
66+
let x = sets[0].intersection(&sets[1]).count();
67+
black_box(x);
68+
})
69+
}
70+
};
71+
}
72+
73+
set_intersection_bench! {intersect_random_100, random(100, 100)}
74+
set_intersection_bench! {intersect_random_10k, random(10_000, 10_000)}
75+
set_intersection_bench! {intersect_random_10_vs_10k, random(10, 10_000)}
76+
set_intersection_bench! {intersect_random_10k_vs_10, random(10_000, 10)}
77+
set_intersection_bench! {intersect_staggered_100, staggered(100, 100)}
78+
set_intersection_bench! {intersect_staggered_10k, staggered(10_000, 10_000)}
79+
set_intersection_bench! {intersect_staggered_10_vs_10k, staggered(10, 10_000)}
80+
set_intersection_bench! {intersect_staggered_10k_vs_10, staggered(10_000, 10)}
81+
set_intersection_bench! {intersect_neg_vs_pos_100, neg_vs_pos(100, 100)}
82+
set_intersection_bench! {intersect_neg_vs_pos_10k, neg_vs_pos(10_000, 10_000)}
83+
set_intersection_bench! {intersect_neg_vs_pos_10_vs_10k,neg_vs_pos(10, 10_000)}
84+
set_intersection_bench! {intersect_neg_vs_pos_10k_vs_10,neg_vs_pos(10_000, 10)}
85+
set_intersection_bench! {intersect_pos_vs_neg_100, pos_vs_neg(100, 100)}
86+
set_intersection_bench! {intersect_pos_vs_neg_10k, pos_vs_neg(10_000, 10_000)}
87+
set_intersection_bench! {intersect_pos_vs_neg_10_vs_10k,pos_vs_neg(10, 10_000)}
88+
set_intersection_bench! {intersect_pos_vs_neg_10k_vs_10,pos_vs_neg(10_000, 10)}

src/liballoc/benches/vec_deque.rs

+7
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,10 @@ fn bench_mut_iter_1000(b: &mut Bencher) {
4545
black_box(sum);
4646
})
4747
}
48+
49+
#[bench]
50+
fn bench_try_fold(b: &mut Bencher) {
51+
let ring: VecDeque<_> = (0..1000).collect();
52+
53+
b.iter(|| black_box(ring.iter().try_fold(0, |a, b| Some(a + b))))
54+
}

src/liballoc/collections/btree/map.rs

+20-12
Original file line numberDiff line numberDiff line change
@@ -1634,9 +1634,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
16341634

16351635
let mut cur_handle = match handle.right_kv() {
16361636
Ok(kv) => {
1637-
let (k, v) = ptr::read(&kv).into_kv_mut();
1638-
self.front = kv.right_edge();
1639-
return (k, v);
1637+
self.front = ptr::read(&kv).right_edge();
1638+
// Doing the descend invalidates the references returned by `into_kv_mut`,
1639+
// so we have to do this last.
1640+
let (k, v) = kv.into_kv_mut();
1641+
return (k, v); // coerce k from `&mut K` to `&K`
16401642
}
16411643
Err(last_edge) => {
16421644
let next_level = last_edge.into_node().ascend().ok();
@@ -1647,9 +1649,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
16471649
loop {
16481650
match cur_handle.right_kv() {
16491651
Ok(kv) => {
1650-
let (k, v) = ptr::read(&kv).into_kv_mut();
1651-
self.front = first_leaf_edge(kv.right_edge().descend());
1652-
return (k, v);
1652+
self.front = first_leaf_edge(ptr::read(&kv).right_edge().descend());
1653+
// Doing the descend invalidates the references returned by `into_kv_mut`,
1654+
// so we have to do this last.
1655+
let (k, v) = kv.into_kv_mut();
1656+
return (k, v); // coerce k from `&mut K` to `&K`
16531657
}
16541658
Err(last_edge) => {
16551659
let next_level = last_edge.into_node().ascend().ok();
@@ -1680,9 +1684,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
16801684

16811685
let mut cur_handle = match handle.left_kv() {
16821686
Ok(kv) => {
1683-
let (k, v) = ptr::read(&kv).into_kv_mut();
1684-
self.back = kv.left_edge();
1685-
return (k, v);
1687+
self.back = ptr::read(&kv).left_edge();
1688+
// Doing the descend invalidates the references returned by `into_kv_mut`,
1689+
// so we have to do this last.
1690+
let (k, v) = kv.into_kv_mut();
1691+
return (k, v); // coerce k from `&mut K` to `&K`
16861692
}
16871693
Err(last_edge) => {
16881694
let next_level = last_edge.into_node().ascend().ok();
@@ -1693,9 +1699,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
16931699
loop {
16941700
match cur_handle.left_kv() {
16951701
Ok(kv) => {
1696-
let (k, v) = ptr::read(&kv).into_kv_mut();
1697-
self.back = last_leaf_edge(kv.left_edge().descend());
1698-
return (k, v);
1702+
self.back = last_leaf_edge(ptr::read(&kv).left_edge().descend());
1703+
// Doing the descend invalidates the references returned by `into_kv_mut`,
1704+
// so we have to do this last.
1705+
let (k, v) = kv.into_kv_mut();
1706+
return (k, v); // coerce k from `&mut K` to `&K`
16991707
}
17001708
Err(last_edge) => {
17011709
let next_level = last_edge.into_node().ascend().ok();

src/liballoc/collections/btree/node.rs

+22-3
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,8 @@ impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
645645
}
646646

647647
fn into_key_slice_mut(mut self) -> &'a mut [K] {
648+
// Same as for `into_key_slice` above, we try to avoid a run-time check
649+
// (the alignment comparison will usually be performed at compile-time).
648650
if mem::align_of::<K>() > mem::align_of::<LeafNode<(), ()>>() && self.is_shared_root() {
649651
&mut []
650652
} else {
@@ -667,9 +669,26 @@ impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
667669
}
668670
}
669671

670-
fn into_slices_mut(self) -> (&'a mut [K], &'a mut [V]) {
671-
let k = unsafe { ptr::read(&self) };
672-
(k.into_key_slice_mut(), self.into_val_slice_mut())
672+
fn into_slices_mut(mut self) -> (&'a mut [K], &'a mut [V]) {
673+
debug_assert!(!self.is_shared_root());
674+
// We cannot use the getters here, because calling the second one
675+
// invalidates the reference returned by the first.
676+
// More precisely, it is the call to `len` that is the culprit,
677+
// because that creates a shared reference to the header, which *can*
678+
// overlap with the keys (and even the values, for ZST keys).
679+
unsafe {
680+
let len = self.len();
681+
let leaf = self.as_leaf_mut();
682+
let keys = slice::from_raw_parts_mut(
683+
MaybeUninit::first_ptr_mut(&mut (*leaf).keys),
684+
len
685+
);
686+
let vals = slice::from_raw_parts_mut(
687+
MaybeUninit::first_ptr_mut(&mut (*leaf).vals),
688+
len
689+
);
690+
(keys, vals)
691+
}
673692
}
674693
}
675694

src/liballoc/collections/vec_deque.rs

+46-5
Original file line numberDiff line numberDiff line change
@@ -2170,12 +2170,29 @@ impl<'a, T> Iterator for Iter<'a, T> {
21702170
back.iter().fold(accum, &mut f)
21712171
}
21722172

2173-
fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
2174-
Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
2173+
fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R
2174+
where
2175+
Self: Sized,
2176+
F: FnMut(B, Self::Item) -> R,
2177+
R: Try<Ok = B>,
21752178
{
2176-
let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail);
2177-
let accum = front.iter().try_fold(init, &mut f)?;
2178-
back.iter().try_fold(accum, &mut f)
2179+
let (mut iter, final_res);
2180+
if self.tail <= self.head {
2181+
// single slice self.ring[self.tail..self.head]
2182+
iter = self.ring[self.tail..self.head].iter();
2183+
final_res = iter.try_fold(init, &mut f);
2184+
} else {
2185+
// two slices: self.ring[self.tail..], self.ring[..self.head]
2186+
let (front, back) = self.ring.split_at(self.tail);
2187+
let mut back_iter = back.iter();
2188+
let res = back_iter.try_fold(init, &mut f);
2189+
let len = self.ring.len();
2190+
self.tail = (self.ring.len() - back_iter.len()) & (len - 1);
2191+
iter = front[..self.head].iter();
2192+
final_res = iter.try_fold(res?, &mut f);
2193+
}
2194+
self.tail = self.head - iter.len();
2195+
final_res
21792196
}
21802197
}
21812198

@@ -2197,6 +2214,30 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
21972214
accum = back.iter().rfold(accum, &mut f);
21982215
front.iter().rfold(accum, &mut f)
21992216
}
2217+
2218+
fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R
2219+
where
2220+
Self: Sized,
2221+
F: FnMut(B, Self::Item) -> R,
2222+
R: Try<Ok = B>,
2223+
{
2224+
let (mut iter, final_res);
2225+
if self.tail <= self.head {
2226+
// single slice self.ring[self.tail..self.head]
2227+
iter = self.ring[self.tail..self.head].iter();
2228+
final_res = iter.try_rfold(init, &mut f);
2229+
} else {
2230+
// two slices: self.ring[self.tail..], self.ring[..self.head]
2231+
let (front, back) = self.ring.split_at(self.tail);
2232+
let mut front_iter = front[..self.head].iter();
2233+
let res = front_iter.try_rfold(init, &mut f);
2234+
self.head = front_iter.len();
2235+
iter = back.iter();
2236+
final_res = iter.try_rfold(res?, &mut f);
2237+
}
2238+
self.head = self.tail + iter.len();
2239+
final_res
2240+
}
22002241
}
22012242

22022243
#[stable(feature = "rust1", since = "1.0.0")]

src/liballoc/tests/vec_deque.rs

+64
Original file line numberDiff line numberDiff line change
@@ -1465,6 +1465,15 @@ fn test_try_fold_unit() {
14651465
assert_eq!(Some(()), v.into_iter().try_fold((), |(), ()| Some(())));
14661466
}
14671467

1468+
1469+
#[test]
1470+
fn test_try_fold_unit_none() {
1471+
let v: std::collections::VecDeque<()> = [(); 10].iter().cloned().collect();
1472+
let mut iter = v.into_iter();
1473+
assert!(iter.try_fold((), |_, _| None).is_none());
1474+
assert_eq!(iter.len(), 9);
1475+
}
1476+
14681477
#[test]
14691478
fn test_try_fold_rotated() {
14701479
let mut v: VecDeque<_> = (0..12).collect();
@@ -1477,3 +1486,58 @@ fn test_try_fold_rotated() {
14771486
assert_eq!(Ok::<_, ()>(66), v.iter().try_fold(0, |a, b| Ok(a + b)));
14781487
}
14791488
}
1489+
1490+
#[test]
1491+
fn test_try_fold_moves_iter() {
1492+
let v: VecDeque<_> = [10, 20, 30, 40, 100, 60, 70, 80, 90].iter().collect();
1493+
let mut iter = v.into_iter();
1494+
assert_eq!(iter.try_fold(0_i8, |acc, &x| acc.checked_add(x)), None);
1495+
assert_eq!(iter.next(), Some(&60));
1496+
}
1497+
1498+
#[test]
1499+
fn test_try_fold_exhaust_wrap() {
1500+
let mut v = VecDeque::with_capacity(7);
1501+
v.push_back(1);
1502+
v.push_back(1);
1503+
v.push_back(1);
1504+
v.pop_front();
1505+
v.pop_front();
1506+
let mut iter = v.iter();
1507+
let _ = iter.try_fold(0, |_, _| Some(1));
1508+
assert!(iter.is_empty());
1509+
}
1510+
1511+
#[test]
1512+
fn test_try_fold_wraparound() {
1513+
let mut v = VecDeque::with_capacity(8);
1514+
v.push_back(7);
1515+
v.push_back(8);
1516+
v.push_back(9);
1517+
v.push_front(2);
1518+
v.push_front(1);
1519+
let mut iter = v.iter();
1520+
let _ = iter.find(|&&x| x == 2);
1521+
assert_eq!(Some(&7), iter.next());
1522+
}
1523+
1524+
#[test]
1525+
fn test_try_rfold_rotated() {
1526+
let mut v: VecDeque<_> = (0..12).collect();
1527+
for n in 0..10 {
1528+
if n & 1 == 0 {
1529+
v.rotate_left(n);
1530+
} else {
1531+
v.rotate_right(n);
1532+
}
1533+
assert_eq!(Ok::<_, ()>(66), v.iter().try_rfold(0, |a, b| Ok(a + b)));
1534+
}
1535+
}
1536+
1537+
#[test]
1538+
fn test_try_rfold_moves_iter() {
1539+
let v : VecDeque<_> = [10, 20, 30, 40, 100, 60, 70, 80, 90].iter().collect();
1540+
let mut iter = v.into_iter();
1541+
assert_eq!(iter.try_rfold(0_i8, |acc, &x| acc.checked_add(x)), None);
1542+
assert_eq!(iter.next_back(), Some(&70));
1543+
}

0 commit comments

Comments
 (0)