LL| |#![allow(unused_assignments)] | |
LL| |#![cfg_attr(rustfmt, rustfmt::skip)] | |
LL| |//@ failure-status: 1 | |
LL| | | |
LL| 6|fn call(return_error: bool) -> Result<(), ()> { | |
LL| 6| if return_error { | |
LL| 1| Err(()) | |
LL| | } else { | |
LL| 5| Ok(()) | |
LL| | } | |
LL| 6|} | |
LL| | | |
LL| 1|fn test1() -> Result<(), ()> { | |
LL| 1| let mut | |
LL| 1| countdown = 10 | |
LL| | ; | |
LL| | for | |
LL| | _ | |
LL| | in | |
LL| 6| 0..10 | |
LL| | { | |
LL| 6| countdown | |
LL| 6| -= 1 | |
LL| 6| ; | |
LL| 6| if | |
LL| 6| countdown < 5 | |
LL| | { | |
LL| 1| call(/*return_error=*/ true)?; | |
LL| 0| call(/*return_error=*/ false)?; | |
LL| | } | |
LL| | else | |
LL| | { | |
LL| 5| call(/*return_error=*/ false)?; | |
^0 | |
LL| | } | |
LL| | } | |
LL| 0| Ok(()) | |
LL| 1|} | |
LL| | | |
LL| |struct Thing1; | |
LL| |impl Thing1 { | |
LL| 18| fn get_thing_2(&self, return_error: bool) -> Result<Thing2, ()> { | |
LL| 18| if return_error { | |
LL| 1| Err(()) | |
LL| | } else { | |
LL| 17| Ok(Thing2 {}) | |
LL| | } | |
LL| 18| } | |
LL| |} | |
LL| | | |
LL| |struct Thing2; | |
LL| |impl Thing2 { | |
LL| 17| fn call(&self, return_error: bool) -> Result<u32, ()> { | |
LL| 17| if return_error { | |
LL| 2| Err(()) | |
LL| | } else { | |
LL| 15| Ok(57) | |
LL| | } | |
LL| 17| } | |
LL| |} | |
LL| | | |
LL| 1|fn test2() -> Result<(), ()> { | |
LL| 1| let thing1 = Thing1{}; | |
LL| 1| let mut | |
LL| 1| countdown = 10 | |
LL| | ; | |
LL| | for | |
LL| | _ | |
LL| | in | |
LL| 6| 0..10 | |
LL| | { | |
LL| 6| countdown | |
LL| 6| -= 1 | |
LL| 6| ; | |
LL| 6| if | |
LL| 6| countdown < 5 | |
LL| | { | |
LL| 1| thing1.get_thing_2(/*err=*/ false)?.call(/*err=*/ true).expect_err("call should fail"); | |
^0 | |
LL| 1| thing1 | |
LL| 1| . | |
LL| 1| get_thing_2(/*return_error=*/ false) | |
LL| 0| ? | |
LL| | . | |
LL| 1| call(/*return_error=*/ true) | |
LL| 1| . | |
LL| 1| expect_err( | |
LL| 1| "call should fail" | |
LL| 1| ); | |
LL| 1| let val = thing1.get_thing_2(/*return_error=*/ true)?.call(/*return_error=*/ true)?; | |
^0 ^0 ^0 | |
LL| 0| assert_eq!(val, 57); | |
LL| 0| let val = thing1.get_thing_2(/*return_error=*/ true)?.call(/*return_error=*/ false)?; | |
LL| 0| assert_eq!(val, 57); | |
LL| | } | |
LL| | else | |
LL| | { | |
LL| 5| let val = thing1.get_thing_2(/*return_error=*/ false)?.call(/*return_error=*/ false)?; | |
^0 ^0 | |
LL| 5| assert_eq!(val, 57); | |
LL| 5| let val = thing1 | |
LL| 5| .get_thing_2(/*return_error=*/ false)? | |
^0 | |
LL| 5| .call(/*return_error=*/ false)?; | |
^0 | |
LL| 5| assert_eq!(val, 57); | |
LL| 5| let val = thing1 | |
LL| 5| .get_thing_2(/*return_error=*/ false) | |
LL| 0| ? | |
LL| 5| .call(/*return_error=*/ false) | |
LL| 0| ? | |
LL| | ; | |
LL| 5| assert_eq!(val, 57); | |
LL| | } | |
LL| | } | |
LL| 0| Ok(()) | |
LL| 1|} | |
LL| | | |
LL| 1|fn main() -> Result<(), ()> { | |
LL| 1| test1().expect_err("test1 should fail"); | |
LL| 1| test2() | |
LL| 1| ? | |
LL| | ; | |
LL| 0| Ok(()) | |
LL| 1|} | |