mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
//@ run-pass
 | 
						|
 | 
						|
#![allow(non_camel_case_types)]
 | 
						|
#![allow(dead_code)]
 | 
						|
//@ compile-flags: --edition 2018
 | 
						|
 | 
						|
#![feature(try_blocks)]
 | 
						|
 | 
						|
struct catch {}
 | 
						|
 | 
						|
pub fn main() {
 | 
						|
    let catch_result: Option<_> = try {
 | 
						|
        let x = 5;
 | 
						|
        x
 | 
						|
    };
 | 
						|
    assert_eq!(catch_result, Some(5));
 | 
						|
 | 
						|
    let mut catch = true;
 | 
						|
    while catch { catch = false; }
 | 
						|
    assert_eq!(catch, false);
 | 
						|
 | 
						|
    catch = if catch { false } else { true };
 | 
						|
    assert_eq!(catch, true);
 | 
						|
 | 
						|
    match catch {
 | 
						|
        _ => {}
 | 
						|
    };
 | 
						|
 | 
						|
    let catch_err: Result<_, i32> = try {
 | 
						|
        Err(22)?;
 | 
						|
        1
 | 
						|
    };
 | 
						|
    assert_eq!(catch_err, Err(22));
 | 
						|
 | 
						|
    let catch_okay: Result<i32, i32> = try {
 | 
						|
        if false { Err(25)?; }
 | 
						|
        Ok::<(), i32>(())?;
 | 
						|
        28
 | 
						|
    };
 | 
						|
    assert_eq!(catch_okay, Ok(28));
 | 
						|
 | 
						|
    let catch_from_loop: Result<i32, i32> = try {
 | 
						|
        for i in 0..10 {
 | 
						|
            if i < 5 { Ok::<i32, i32>(i)?; } else { Err(i)?; }
 | 
						|
        }
 | 
						|
        22
 | 
						|
    };
 | 
						|
    assert_eq!(catch_from_loop, Err(5));
 | 
						|
 | 
						|
    let cfg_init;
 | 
						|
    let _res: Result<(), ()> = try {
 | 
						|
        cfg_init = 5;
 | 
						|
    };
 | 
						|
    assert_eq!(cfg_init, 5);
 | 
						|
 | 
						|
    let cfg_init_2;
 | 
						|
    let _res: Result<(), ()> = try {
 | 
						|
        cfg_init_2 = 6;
 | 
						|
        Err(())?;
 | 
						|
    };
 | 
						|
    assert_eq!(cfg_init_2, 6);
 | 
						|
 | 
						|
    let my_string = "test".to_string();
 | 
						|
    let res: Result<&str, ()> = try {
 | 
						|
        // Unfortunately, deref doesn't fire here (#49356)
 | 
						|
        &my_string[..]
 | 
						|
    };
 | 
						|
    assert_eq!(res, Ok("test"));
 | 
						|
 | 
						|
    let my_opt: Option<_> = try { () };
 | 
						|
    assert_eq!(my_opt, Some(()));
 | 
						|
 | 
						|
    let my_opt: Option<_> = try { };
 | 
						|
    assert_eq!(my_opt, Some(()));
 | 
						|
}
 |