
For coverage tests, splitting code across multiple lines often makes the resulting coverage report easier to interpret, so we force rustfmt to retain line breaks by adding dummy line comments with `//`.
35 lines
1.6 KiB
Text
35 lines
1.6 KiB
Text
LL| |#![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
|
|
LL| |
|
|
LL| |use std::ops::{Coroutine, CoroutineState};
|
|
LL| |use std::pin::Pin;
|
|
LL| |
|
|
LL| |// The following implementation of a function called from a `yield` statement
|
|
LL| |// (apparently requiring the Result and the `String` type or constructor)
|
|
LL| |// creates conditions where the `coroutine::StateTransform` MIR transform will
|
|
LL| |// drop all `Counter` `Coverage` statements from a MIR. `simplify.rs` has logic
|
|
LL| |// to handle this condition, and still report dead block coverage.
|
|
LL| 1|fn get_u32(val: bool) -> Result<u32, String> {
|
|
LL| 1| if val {
|
|
LL| 1| Ok(1) //
|
|
LL| | } else {
|
|
LL| 0| Err(String::from("some error")) //
|
|
LL| | }
|
|
LL| 1|}
|
|
LL| |
|
|
LL| 1|fn main() {
|
|
LL| 1| let is_true = std::env::args().len() == 1;
|
|
LL| 1| let mut coroutine = #[coroutine] || {
|
|
LL| 1| yield get_u32(is_true);
|
|
LL| 1| return "foo";
|
|
LL| 1| };
|
|
LL| |
|
|
LL| 1| match Pin::new(&mut coroutine).resume(()) {
|
|
LL| 1| CoroutineState::Yielded(Ok(1)) => {}
|
|
LL| 0| _ => panic!("unexpected return from resume"),
|
|
LL| | }
|
|
LL| 1| match Pin::new(&mut coroutine).resume(()) {
|
|
LL| 1| CoroutineState::Complete("foo") => {}
|
|
LL| 0| _ => panic!("unexpected return from resume"),
|
|
LL| | }
|
|
LL| 1|}
|
|
|