]> git.lizzy.rs Git - rust.git/blob - src/test/ui/try-block.rs
Merge branch 'master' into rusty-hermit
[rust.git] / src / test / ui / try-block.rs
1 // run-pass
2
3 #![allow(non_camel_case_types)]
4 #![allow(dead_code)]
5 // compile-flags: --edition 2018
6
7 #![feature(try_blocks)]
8
9 struct catch {}
10
11 pub fn main() {
12     let catch_result: Option<_> = try {
13         let x = 5;
14         x
15     };
16     assert_eq!(catch_result, Some(5));
17
18     let mut catch = true;
19     while catch { catch = false; }
20     assert_eq!(catch, false);
21
22     catch = if catch { false } else { true };
23     assert_eq!(catch, true);
24
25     match catch {
26         _ => {}
27     };
28
29     let catch_err: Result<_, i32> = try {
30         Err(22)?;
31         1
32     };
33     assert_eq!(catch_err, Err(22));
34
35     let catch_okay: Result<i32, i32> = try {
36         if false { Err(25)?; }
37         Ok::<(), i32>(())?;
38         28
39     };
40     assert_eq!(catch_okay, Ok(28));
41
42     let catch_from_loop: Result<i32, i32> = try {
43         for i in 0..10 {
44             if i < 5 { Ok::<i32, i32>(i)?; } else { Err(i)?; }
45         }
46         22
47     };
48     assert_eq!(catch_from_loop, Err(5));
49
50     let cfg_init;
51     let _res: Result<(), ()> = try {
52         cfg_init = 5;
53     };
54     assert_eq!(cfg_init, 5);
55
56     let cfg_init_2;
57     let _res: Result<(), ()> = try {
58         cfg_init_2 = 6;
59         Err(())?;
60     };
61     assert_eq!(cfg_init_2, 6);
62
63     let my_string = "test".to_string();
64     let res: Result<&str, ()> = try {
65         // Unfortunately, deref doesn't fire here (#49356)
66         &my_string[..]
67     };
68     assert_eq!(res, Ok("test"));
69
70     let my_opt: Option<_> = try { () };
71     assert_eq!(my_opt, Some(()));
72
73     let my_opt: Option<_> = try { };
74     assert_eq!(my_opt, Some(()));
75 }