]> git.proxmox.com Git - rustc.git/blame - src/test/ui/traits/issue-38033.rs
New upstream version 1.67.1+dfsg1
[rustc.git] / src / test / ui / traits / issue-38033.rs
CommitLineData
b7449926 1// run-pass
c30ab7b3
SL
2use std::marker;
3use std::mem;
4
5fn main() {
6 let workers = (0..0).map(|_| result::<u32, ()>());
7 drop(join_all(workers).poll());
8}
9
10trait Future {
11 type Item;
12 type Error;
13
14 fn poll(&mut self) -> Result<Self::Item, Self::Error>;
15}
16
17trait IntoFuture {
18 type Future: Future<Item=Self::Item, Error=Self::Error>;
19 type Item;
20 type Error;
21
22 fn into_future(self) -> Self::Future;
23}
24
25impl<F: Future> IntoFuture for F {
26 type Future = F;
27 type Item = F::Item;
28 type Error = F::Error;
29
30 fn into_future(self) -> F {
31 self
32 }
33}
34
35struct FutureResult<T, E> {
36 _inner: marker::PhantomData<(T, E)>,
37}
38
39fn result<T, E>() -> FutureResult<T, E> {
40 loop {}
41}
42
43impl<T, E> Future for FutureResult<T, E> {
44 type Item = T;
45 type Error = E;
46
47 fn poll(&mut self) -> Result<T, E> {
48 loop {}
49 }
50}
51
52struct JoinAll<I>
53 where I: IntoIterator,
54 I::Item: IntoFuture,
55{
56 elems: Vec<<I::Item as IntoFuture>::Item>,
57}
58
59fn join_all<I>(_: I) -> JoinAll<I>
60 where I: IntoIterator,
61 I::Item: IntoFuture,
62{
63 JoinAll { elems: vec![] }
64}
65
66impl<I> Future for JoinAll<I>
67 where I: IntoIterator,
68 I::Item: IntoFuture,
69{
70 type Item = Vec<<I::Item as IntoFuture>::Item>;
71 type Error = <I::Item as IntoFuture>::Error;
72
73 fn poll(&mut self) -> Result<Self::Item, Self::Error> {
74 let elems = mem::replace(&mut self.elems, Vec::new());
75 Ok(elems.into_iter().map(|e| {
76 e
77 }).collect::<Vec<_>>())
78 }
79}