]> git.lizzy.rs Git - rust.git/blob - tests/ui/polymorphization/generators.rs
Rollup merge of #105172 - alexs-sh:issue-98861-fix-next, r=scottmcm
[rust.git] / tests / ui / polymorphization / generators.rs
1 // build-fail
2 // compile-flags:-Zpolymorphize=on -Zinline-mir=off
3 #![feature(generic_const_exprs, generators, generator_trait, rustc_attrs)]
4 //~^ WARN the feature `generic_const_exprs` is incomplete
5
6 use std::marker::Unpin;
7 use std::ops::{Generator, GeneratorState};
8 use std::pin::Pin;
9
10 enum YieldOrReturn<Y, R> {
11     Yield(Y),
12     Return(R),
13 }
14
15 fn finish<T, Y, R>(mut t: T) -> Vec<YieldOrReturn<Y, R>>
16 where
17     T: Generator<(), Yield = Y, Return = R> + Unpin,
18 {
19     let mut results = Vec::new();
20     loop {
21         match Pin::new(&mut t).resume(()) {
22             GeneratorState::Yielded(yielded) => results.push(YieldOrReturn::Yield(yielded)),
23             GeneratorState::Complete(returned) => {
24                 results.push(YieldOrReturn::Return(returned));
25                 return results;
26             }
27         }
28     }
29 }
30
31 // This test checks that the polymorphization analysis functions on generators.
32
33 #[rustc_polymorphize_error]
34 pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
35     || {
36         //~^ ERROR item has unused generic parameters
37         yield 1;
38         2
39     }
40 }
41
42 #[rustc_polymorphize_error]
43 pub fn used_type_in_yield<Y: Default>() -> impl Generator<(), Yield = Y, Return = u32> + Unpin {
44     || {
45         yield Y::default();
46         2
47     }
48 }
49
50 #[rustc_polymorphize_error]
51 pub fn used_type_in_return<R: Default>() -> impl Generator<(), Yield = u32, Return = R> + Unpin {
52     || {
53         yield 3;
54         R::default()
55     }
56 }
57
58 #[rustc_polymorphize_error]
59 pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
60     || {
61         //~^ ERROR item has unused generic parameters
62         yield 1;
63         2
64     }
65 }
66
67 #[rustc_polymorphize_error]
68 pub fn used_const_in_yield<const Y: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
69 {
70     || {
71         yield Y;
72         2
73     }
74 }
75
76 #[rustc_polymorphize_error]
77 pub fn used_const_in_return<const R: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
78 {
79     || {
80         yield 4;
81         R
82     }
83 }
84
85 fn main() {
86     finish(unused_type::<u32>());
87     finish(used_type_in_yield::<u32>());
88     finish(used_type_in_return::<u32>());
89     finish(unused_const::<1u32>());
90     finish(used_const_in_yield::<1u32>());
91     finish(used_const_in_return::<1u32>());
92 }