rollup merge of #19316: steveklabnik/gh18876

Fixes #18876
This commit is contained in:
Alex Crichton 2014-11-26 09:46:57 -08:00
commit 8999a7987c
1 changed files with 32 additions and 16 deletions

View File

@ -186,26 +186,42 @@ macro_rules! debug_assert_eq(
($($arg:tt)*) => (if cfg!(not(ndebug)) { assert_eq!($($arg)*); })
)
/// A utility macro for indicating unreachable code. It will panic if
/// executed. This is occasionally useful to put after loops that never
/// terminate normally, but instead directly return from a function.
/// A utility macro for indicating unreachable code.
///
/// # Example
/// This is useful any time that the compiler can't determine that some code is unreachable. For
/// example:
///
/// ```{.rust}
/// struct Item { weight: uint }
/// * Match arms with guard conditions.
/// * Loops that dynamically terminate.
/// * Iterators that dynamically terminate.
///
/// fn choose_weighted_item(v: &[Item]) -> Item {
/// assert!(!v.is_empty());
/// let mut so_far = 0u;
/// for item in v.iter() {
/// so_far += item.weight;
/// if so_far > 100 {
/// return *item;
/// }
/// # Panics
///
/// This will always panic.
///
/// # Examples
///
/// Match arms:
///
/// ```rust
/// fn foo(x: Option<int>) {
/// match x {
/// Some(n) if n >= 0 => println!("Some(Non-negative)"),
/// Some(n) if n < 0 => println!("Some(Negative)"),
/// Some(_) => unreachable!(), // compile error if commented out
/// None => println!("None")
/// }
/// ```
///
/// Iterators:
///
/// ```rust
/// fn divide_by_three(x: i32) -> i32 { // one of the poorest implementations of x/3
/// for i in std::iter::count(0_i32, 1) {
/// if i < 0 { panic!("i32 overflow"); }
/// if x < 3*i { return i; }
/// }
/// // The above loop always returns, so we must hint to the
/// // type checker that it isn't possible to get down here
///
/// unreachable!();
/// }
/// ```