1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
LL| |#![allow(unused_assignments)]
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|}
|