2020-06-22 07:57:03 -05:00
|
|
|
// build-fail
|
2021-09-30 21:03:49 -05:00
|
|
|
// compile-flags:-Zpolymorphize=on -Zinline-mir=off
|
2021-08-27 11:04:57 -05:00
|
|
|
#![feature(generic_const_exprs, generators, generator_trait, rustc_attrs)]
|
|
|
|
//~^ WARN the feature `generic_const_exprs` is incomplete
|
2020-06-22 07:57:03 -05:00
|
|
|
|
|
|
|
use std::marker::Unpin;
|
|
|
|
use std::ops::{Generator, GeneratorState};
|
|
|
|
use std::pin::Pin;
|
|
|
|
|
|
|
|
enum YieldOrReturn<Y, R> {
|
|
|
|
Yield(Y),
|
|
|
|
Return(R),
|
|
|
|
}
|
|
|
|
|
|
|
|
fn finish<T, Y, R>(mut t: T) -> Vec<YieldOrReturn<Y, R>>
|
|
|
|
where
|
|
|
|
T: Generator<(), Yield = Y, Return = R> + Unpin,
|
|
|
|
{
|
|
|
|
let mut results = Vec::new();
|
|
|
|
loop {
|
|
|
|
match Pin::new(&mut t).resume(()) {
|
|
|
|
GeneratorState::Yielded(yielded) => results.push(YieldOrReturn::Yield(yielded)),
|
|
|
|
GeneratorState::Complete(returned) => {
|
|
|
|
results.push(YieldOrReturn::Return(returned));
|
|
|
|
return results;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// This test checks that the polymorphization analysis functions on generators.
|
|
|
|
|
2020-07-16 11:52:23 -05:00
|
|
|
#[rustc_polymorphize_error]
|
2020-06-22 07:57:03 -05:00
|
|
|
pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
|
|
|
|
|| {
|
|
|
|
//~^ ERROR item has unused generic parameters
|
|
|
|
yield 1;
|
|
|
|
2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-16 11:52:23 -05:00
|
|
|
#[rustc_polymorphize_error]
|
2020-06-22 07:57:03 -05:00
|
|
|
pub fn used_type_in_yield<Y: Default>() -> impl Generator<(), Yield = Y, Return = u32> + Unpin {
|
|
|
|
|| {
|
|
|
|
yield Y::default();
|
|
|
|
2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-16 11:52:23 -05:00
|
|
|
#[rustc_polymorphize_error]
|
2020-06-22 07:57:03 -05:00
|
|
|
pub fn used_type_in_return<R: Default>() -> impl Generator<(), Yield = u32, Return = R> + Unpin {
|
|
|
|
|| {
|
|
|
|
yield 3;
|
|
|
|
R::default()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-16 11:52:23 -05:00
|
|
|
#[rustc_polymorphize_error]
|
2020-06-22 07:57:03 -05:00
|
|
|
pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
|
|
|
|
|| {
|
|
|
|
//~^ ERROR item has unused generic parameters
|
|
|
|
yield 1;
|
|
|
|
2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-16 11:52:23 -05:00
|
|
|
#[rustc_polymorphize_error]
|
2020-06-22 07:57:03 -05:00
|
|
|
pub fn used_const_in_yield<const Y: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
|
|
|
|
{
|
|
|
|
|| {
|
|
|
|
yield Y;
|
|
|
|
2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-16 11:52:23 -05:00
|
|
|
#[rustc_polymorphize_error]
|
2020-06-22 07:57:03 -05:00
|
|
|
pub fn used_const_in_return<const R: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
|
|
|
|
{
|
|
|
|
|| {
|
|
|
|
yield 4;
|
|
|
|
R
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
finish(unused_type::<u32>());
|
|
|
|
finish(used_type_in_yield::<u32>());
|
|
|
|
finish(used_type_in_return::<u32>());
|
|
|
|
finish(unused_const::<1u32>());
|
|
|
|
finish(used_const_in_yield::<1u32>());
|
|
|
|
finish(used_const_in_return::<1u32>());
|
|
|
|
}
|