mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			31 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![feature(coroutines, coroutine_trait)]
 | |
| 
 | |
| use std::ops::{Coroutine, CoroutineState};
 | |
| use std::pin::Pin;
 | |
| 
 | |
| // The following implementation of a function called from a `yield` statement
 | |
| // (apparently requiring the Result and the `String` type or constructor)
 | |
| // creates conditions where the `coroutine::StateTransform` MIR transform will
 | |
| // drop all `Counter` `Coverage` statements from a MIR. `simplify.rs` has logic
 | |
| // to handle this condition, and still report dead block coverage.
 | |
| fn get_u32(val: bool) -> Result<u32, String> {
 | |
|     if val { Ok(1) } else { Err(String::from("some error")) }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     let is_true = std::env::args().len() == 1;
 | |
|     let mut coroutine = || {
 | |
|         yield get_u32(is_true);
 | |
|         return "foo";
 | |
|     };
 | |
| 
 | |
|     match Pin::new(&mut coroutine).resume(()) {
 | |
|         CoroutineState::Yielded(Ok(1)) => {}
 | |
|         _ => panic!("unexpected return from resume"),
 | |
|     }
 | |
|     match Pin::new(&mut coroutine).resume(()) {
 | |
|         CoroutineState::Complete("foo") => {}
 | |
|         _ => panic!("unexpected return from resume"),
 | |
|     }
 | |
| }
 | 
