Skip to content

Commit e3cfb61

Browse files
committed
Auto merge of #1169 - RalfJung:rustup, r=RalfJung
rustup; fix generator test
2 parents 602e1a0 + 45f6744 commit e3cfb61

File tree

3 files changed

+112
-20
lines changed

3 files changed

+112
-20
lines changed

rust-version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
333c32a5a4a51cae562c47e0669bc5aeaf741c45
1+
b5e21dbb5cabdaaadc47a4d8e3f59979dcad2871

tests/compile-fail/generator-pinned-moved.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ where
2525

2626
fn next(&mut self) -> Option<Self::Item> {
2727
let me = unsafe { Pin::new_unchecked(&mut self.0) };
28-
match me.resume() {
28+
match me.resume(()) {
2929
GeneratorState::Yielded(x) => Some(x),
3030
GeneratorState::Complete(_) => None,
3131
}

tests/run-pass/generator.rs

+110-18
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
#![feature(generators, generator_trait, never_type)]
22

3-
use std::ops::{GeneratorState, Generator};
3+
use std::ops::{GeneratorState::{self, *}, Generator};
44
use std::pin::Pin;
5+
use std::sync::atomic::{AtomicUsize, Ordering};
6+
use std::fmt::Debug;
57

6-
fn finish<T>(mut amt: usize, mut t: T) -> T::Return
7-
where T: Generator<Yield = usize>
8-
{
9-
// We are not moving the `t` around until it gets dropped, so this is okay.
10-
let mut t = unsafe { Pin::new_unchecked(&mut t) };
11-
loop {
12-
match t.as_mut().resume() {
13-
GeneratorState::Yielded(y) => amt -= y,
14-
GeneratorState::Complete(ret) => {
15-
assert_eq!(amt, 0);
16-
return ret
8+
fn basic() {
9+
fn finish<T>(mut amt: usize, mut t: T) -> T::Return
10+
where T: Generator<Yield = usize>
11+
{
12+
// We are not moving the `t` around until it gets dropped, so this is okay.
13+
let mut t = unsafe { Pin::new_unchecked(&mut t) };
14+
loop {
15+
match t.as_mut().resume(()) {
16+
GeneratorState::Yielded(y) => amt -= y,
17+
GeneratorState::Complete(ret) => {
18+
assert_eq!(amt, 0);
19+
return ret
20+
}
1721
}
1822
}
1923
}
20-
}
2124

22-
enum Never {}
23-
fn never() -> Never {
24-
panic!()
25-
}
25+
enum Never {}
26+
fn never() -> Never {
27+
panic!()
28+
}
2629

27-
fn main() {
2830
finish(1, || yield 1);
2931

3032
finish(3, || {
@@ -94,3 +96,93 @@ fn main() {
9496
let _x: (String, !) = (String::new(), { yield 2; return });
9597
});
9698
}
99+
100+
fn smoke_resume_arg() {
101+
fn drain<G: Generator<R, Yield = Y> + Unpin, R, Y>(
102+
gen: &mut G,
103+
inout: Vec<(R, GeneratorState<Y, G::Return>)>,
104+
) where
105+
Y: Debug + PartialEq,
106+
G::Return: Debug + PartialEq,
107+
{
108+
let mut gen = Pin::new(gen);
109+
110+
for (input, out) in inout {
111+
assert_eq!(gen.as_mut().resume(input), out);
112+
}
113+
}
114+
115+
static DROPS: AtomicUsize = AtomicUsize::new(0);
116+
117+
#[derive(Debug, PartialEq)]
118+
struct DropMe;
119+
120+
impl Drop for DropMe {
121+
fn drop(&mut self) {
122+
DROPS.fetch_add(1, Ordering::SeqCst);
123+
}
124+
}
125+
126+
fn expect_drops<T>(expected_drops: usize, f: impl FnOnce() -> T) -> T {
127+
DROPS.store(0, Ordering::SeqCst);
128+
129+
let res = f();
130+
131+
let actual_drops = DROPS.load(Ordering::SeqCst);
132+
assert_eq!(actual_drops, expected_drops);
133+
res
134+
}
135+
136+
drain(
137+
&mut |mut b| {
138+
while b != 0 {
139+
b = yield (b + 1);
140+
}
141+
-1
142+
},
143+
vec![(1, Yielded(2)), (-45, Yielded(-44)), (500, Yielded(501)), (0, Complete(-1))],
144+
);
145+
146+
expect_drops(2, || drain(&mut |a| yield a, vec![(DropMe, Yielded(DropMe))]));
147+
148+
expect_drops(6, || {
149+
drain(
150+
&mut |a| yield yield a,
151+
vec![(DropMe, Yielded(DropMe)), (DropMe, Yielded(DropMe)), (DropMe, Complete(DropMe))],
152+
)
153+
});
154+
155+
#[allow(unreachable_code)]
156+
expect_drops(2, || drain(&mut |a| yield return a, vec![(DropMe, Complete(DropMe))]));
157+
158+
expect_drops(2, || {
159+
drain(
160+
&mut |a: DropMe| {
161+
if false { yield () } else { a }
162+
},
163+
vec![(DropMe, Complete(DropMe))],
164+
)
165+
});
166+
167+
expect_drops(4, || {
168+
drain(
169+
#[allow(unused_assignments, unused_variables)]
170+
&mut |mut a: DropMe| {
171+
a = yield;
172+
a = yield;
173+
a = yield;
174+
},
175+
vec![
176+
(DropMe, Yielded(())),
177+
(DropMe, Yielded(())),
178+
(DropMe, Yielded(())),
179+
(DropMe, Complete(())),
180+
],
181+
)
182+
});
183+
}
184+
185+
fn main() {
186+
basic();
187+
smoke_resume_arg();
188+
}

0 commit comments

Comments
 (0)