]> git.proxmox.com Git - rustc.git/blob - src/test/ui/try-block.rs
New upstream version 1.38.0+dfsg1
[rustc.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 }