mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 a48cebc4b8
			
		
	
	
		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);
 | |
| }
 |