2017-06-20 09:26:53 -05:00
|
|
|
#![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()
|
|
|
|
};
|
|
|
|
};
|
2018-09-15 10:12:48 -05:00
|
|
|
// compare lengths; ptr comparison is not deterministic
|
|
|
|
assert_eq!(trait_unified_2.len(), 1);
|
|
|
|
assert_eq!(trait_unified_2[0].len(), 0);
|
2017-06-20 09:26:53 -05:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|