]> git.lizzy.rs Git - rust.git/blob - src/test/ui/result-opt-conversions.rs
Rollup merge of #61207 - taiki-e:arbitrary_self_types-lifetime-elision-2, r=Centril
[rust.git] / src / test / ui / result-opt-conversions.rs
1 // run-pass
2
3 #[derive(Copy, Clone, Debug, PartialEq)]
4 struct BadNumErr;
5
6 fn try_num(x: i32) -> Result<i32, BadNumErr> {
7     if x <= 5 {
8         Ok(x + 1)
9     } else {
10         Err(BadNumErr)
11     }
12 }
13
14 type ResOpt = Result<Option<i32>, BadNumErr>;
15 type OptRes = Option<Result<i32, BadNumErr>>;
16
17 fn main() {
18     let mut x: ResOpt = Ok(Some(5));
19     let mut y: OptRes = Some(Ok(5));
20     assert_eq!(x, y.transpose());
21     assert_eq!(x.transpose(), y);
22
23     x = Ok(None);
24     y = None;
25     assert_eq!(x, y.transpose());
26     assert_eq!(x.transpose(), y);
27
28     x = Err(BadNumErr);
29     y = Some(Err(BadNumErr));
30     assert_eq!(x, y.transpose());
31     assert_eq!(x.transpose(), y);
32
33     let res: Result<Vec<i32>, BadNumErr> =
34         (0..10)
35             .map(|x| {
36                 let y = try_num(x)?;
37                 Ok(if y % 2 == 0 {
38                     Some(y - 1)
39                 } else {
40                     None
41                 })
42             })
43             .filter_map(Result::transpose)
44             .collect();
45
46     assert_eq!(res, Err(BadNumErr))
47 }