]> git.lizzy.rs Git - rust.git/blob - src/test/ui/polymorphization/generators.rs
Rollup merge of #88137 - joshtriplett:osx-strip-symbols-no-option, r=michaelwoerister
[rust.git] / src / test / ui / polymorphization / generators.rs
1 // build-fail
2 // compile-flags:-Zpolymorphize=on
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     //~^ ERROR item has unused generic parameters
36     || {
37         //~^ ERROR item has unused generic parameters
38         yield 1;
39         2
40     }
41 }
42
43 #[rustc_polymorphize_error]
44 pub fn used_type_in_yield<Y: Default>() -> impl Generator<(), Yield = Y, Return = u32> + Unpin {
45     || {
46         yield Y::default();
47         2
48     }
49 }
50
51 #[rustc_polymorphize_error]
52 pub fn used_type_in_return<R: Default>() -> impl Generator<(), Yield = u32, Return = R> + Unpin {
53     || {
54         yield 3;
55         R::default()
56     }
57 }
58
59 #[rustc_polymorphize_error]
60 pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
61     //~^ ERROR item has unused generic parameters
62     || {
63         //~^ ERROR item has unused generic parameters
64         yield 1;
65         2
66     }
67 }
68
69 #[rustc_polymorphize_error]
70 pub fn used_const_in_yield<const Y: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
71 {
72     || {
73         yield Y;
74         2
75     }
76 }
77
78 #[rustc_polymorphize_error]
79 pub fn used_const_in_return<const R: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
80 {
81     || {
82         yield 4;
83         R
84     }
85 }
86
87 fn main() {
88     finish(unused_type::<u32>());
89     finish(used_type_in_yield::<u32>());
90     finish(used_type_in_return::<u32>());
91     finish(unused_const::<1u32>());
92     finish(used_const_in_yield::<1u32>());
93     finish(used_const_in_return::<1u32>());
94 }