diff options
| -rw-r--r-- | src/tools/miri/tests/pass/coroutine.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/tools/miri/tests/pass/coroutine.rs b/src/tools/miri/tests/pass/coroutine.rs index 49bfa92a052..7e1f64df04d 100644 --- a/src/tools/miri/tests/pass/coroutine.rs +++ b/src/tools/miri/tests/pass/coroutine.rs @@ -220,7 +220,38 @@ fn smoke_resume_arg() { }); } +fn uninit_fields() { + // Test that uninhabited saved local doesn't make the entire variant uninhabited. + // (https://github.com/rust-lang/rust/issues/115145, https://github.com/rust-lang/rust/pull/118871) + 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(()))); + } + + run::<!>(false, false); +} + fn main() { basic(); smoke_resume_arg(); + uninit_fields(); } |
