]> git.proxmox.com Git - rustc.git/blob - src/test/ui/polymorphization/generators.rs
New upstream version 1.67.1+dfsg1
[rustc.git] / src / test / 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 }