a48cebc4b8
Wrap coroutine variant fields in MaybeUninit to indicate that they might be uninitialized. Otherwise an uninhabited field will make the entire variant uninhabited and introduce undefined behaviour. The analogous issue in the prefix of coroutine layout was addressed by 6fae7f807146e400fa2bbd1c44768d9bcaa57c4c.
38 lines
899 B
Rust
38 lines
899 B
Rust
// Test that uninhabited saved local doesn't make the entire variant uninhabited.
|
|
// run-pass
|
|
#![allow(unused)]
|
|
#![feature(assert_matches)]
|
|
#![feature(coroutine_trait)]
|
|
#![feature(coroutines)]
|
|
#![feature(never_type)]
|
|
use std::assert_matches::assert_matches;
|
|
use std::ops::Coroutine;
|
|
use std::ops::CoroutineState;
|
|
use std::pin::Pin;
|
|
|
|
fn conjure<T>() -> T { loop {} }
|
|
|
|
fn run<T>(x: bool, y: bool) {
|
|
let mut c = || {
|
|
if x {
|
|
let a : T;
|
|
if y {
|
|
a = conjure::<T>();
|
|
}
|
|
yield ();
|
|
} else {
|
|
let a : T;
|
|
if y {
|
|
a = conjure::<T>();
|
|
}
|
|
yield ();
|
|
}
|
|
};
|
|
assert_matches!(Pin::new(&mut c).resume(()), CoroutineState::Yielded(()));
|
|
assert_matches!(Pin::new(&mut c).resume(()), CoroutineState::Complete(()));
|
|
}
|
|
|
|
fn main() {
|
|
run::<!>(false, false);
|
|
}
|