| //@ 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); |
| } |