#![feature(never_type)] #![allow(unreachable_code)] #[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() }; }; // compare lengths; ptr comparison is not deterministic assert_eq!(trait_unified_2.len(), 1); assert_eq!(trait_unified_2[0].len(), 0); 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); }