From 823e2e784220d96b5ca27f0a6b2751994958c965 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 14 Dec 2023 07:57:36 +0100 Subject: [PATCH] add test for uninhabited saved locals in a coroutine --- src/tools/miri/tests/pass/coroutine.rs | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) 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 { + loop {} + } + + fn run(x: bool, y: bool) { + let mut c = || { + if x { + let _a: T; + if y { + _a = conjure::(); + } + yield (); + } else { + let _a: T; + if y { + _a = conjure::(); + } + 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(); }