mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			140 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // run-pass
 | |
| 
 | |
| #![allow(unreachable_code)]
 | |
| #![feature(never_type)]
 | |
| 
 | |
| #[allow(unused)]
 | |
| fn never_returns() {
 | |
|     loop {
 | |
|         break loop {};
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub fn main() {
 | |
|     let value = 'outer: loop {
 | |
|         if 1 == 1 {
 | |
|             break 13;
 | |
|         } else {
 | |
|             let _never: ! = loop {
 | |
|                 break loop {
 | |
|                     break 'outer panic!();
 | |
|                 }
 | |
|             };
 | |
|         }
 | |
|     };
 | |
|     assert_eq!(value, 13);
 | |
| 
 | |
|     let x = [1, 3u32, 5];
 | |
|     let y = [17];
 | |
|     let z = [];
 | |
|     let coerced: &[_] = loop {
 | |
|         match 2 {
 | |
|             1 => break &x,
 | |
|             2 => break &y,
 | |
|             3 => break &z,
 | |
|             _ => (),
 | |
|         }
 | |
|     };
 | |
|     assert_eq!(coerced, &[17u32]);
 | |
| 
 | |
|     let trait_unified = loop {
 | |
|         break if true {
 | |
|             break Default::default()
 | |
|         } else {
 | |
|             break [13, 14]
 | |
|         };
 | |
|     };
 | |
|     assert_eq!(trait_unified, [0, 0]);
 | |
| 
 | |
|     let trait_unified_2 = loop {
 | |
|         if false {
 | |
|             break [String::from("Hello")]
 | |
|         } else {
 | |
|             break Default::default()
 | |
|         };
 | |
|     };
 | |
|     assert_eq!(trait_unified_2, [""]);
 | |
| 
 | |
|     let trait_unified_3 = loop {
 | |
|         break if false {
 | |
|             break [String::from("Hello")]
 | |
|         } else {
 | |
|             ["Yes".into()]
 | |
|         };
 | |
|     };
 | |
|     assert_eq!(trait_unified_3, ["Yes"]);
 | |
| 
 | |
|     let regular_break = loop {
 | |
|         if true {
 | |
|             break;
 | |
|         } else {
 | |
|             break break Default::default();
 | |
|         }
 | |
|     };
 | |
|     assert_eq!(regular_break, ());
 | |
| 
 | |
|     let regular_break_2 = loop {
 | |
|         if true {
 | |
|             break Default::default();
 | |
|         } else {
 | |
|             break;
 | |
|         }
 | |
|     };
 | |
|     assert_eq!(regular_break_2, ());
 | |
| 
 | |
|     let regular_break_3 = loop {
 | |
|         break if true {
 | |
|             Default::default()
 | |
|         } else {
 | |
|             break;
 | |
|         }
 | |
|     };
 | |
|     assert_eq!(regular_break_3, ());
 | |
| 
 | |
|     let regular_break_4 = loop {
 | |
|         break ();
 | |
|         break;
 | |
|     };
 | |
|     assert_eq!(regular_break_4, ());
 | |
| 
 | |
|     let regular_break_5 = loop {
 | |
|         break;
 | |
|         break ();
 | |
|     };
 | |
|     assert_eq!(regular_break_5, ());
 | |
| 
 | |
|     let nested_break_value = 'outer2: loop {
 | |
|         let _a: u32 = 'inner: loop {
 | |
|             if true {
 | |
|                 break 'outer2 "hello";
 | |
|             } else {
 | |
|                 break 'inner 17;
 | |
|             }
 | |
|         };
 | |
|         panic!();
 | |
|     };
 | |
|     assert_eq!(nested_break_value, "hello");
 | |
| 
 | |
|     let break_from_while_cond = loop {
 | |
|         'inner_loop: while break 'inner_loop {
 | |
|             panic!();
 | |
|         }
 | |
|         break 123;
 | |
|     };
 | |
|     assert_eq!(break_from_while_cond, 123);
 | |
| 
 | |
|     let break_from_while_to_outer = 'outer_loop: loop {
 | |
|         while break 'outer_loop 567 {
 | |
|             panic!("from_inner");
 | |
|         }
 | |
|         panic!("from outer");
 | |
|     };
 | |
|     assert_eq!(break_from_while_to_outer, 567);
 | |
| 
 | |
|     let rust = true;
 | |
|     let value = loop {
 | |
|         break rust;
 | |
|     };
 | |
|     assert!(value);
 | |
| }
 | 
