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
6fae7f8071
.
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);
|
|
}
|