rust/src/test/compile-fail/issue-27042.rs
Niko Matsakis 16a71cce51 rework how we handle the type of loops
First, we keep a `CoerceMany` now to find the LUB of all the break
expressions. Second, this `CoerceMany` is actually an
`Option<CoerceMany>`, and we store `None` for loops where "break with an
expression" is disallowed. This avoids silly duplicate errors about a
type mismatch, since the loops pass already reports an error that the
break cannot have an expression. Finally, since we now detect an invalid
break target during HIR lowering, refactor `find_loop` to be infallible.

Adjust tests as needed:

- some spans from breaks are slightly different
- break up a single loop into multiple since `CoerceMany` silences
  redundant and derived errors
- add a ui test that we only give on error for loop-break-value
2017-03-30 07:55:29 -04:00

26 lines
1 KiB
Rust

// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// Regression test for #27042. Test that a loop's label is included in its span.
fn main() {
let _: i32 =
'a: // in this case, the citation is just the `break`:
loop { break }; //~ ERROR mismatched types
let _: i32 =
'b: //~ ERROR mismatched types
while true { break }; // but here we cite the whole loop
let _: i32 =
'c: //~ ERROR mismatched types
for _ in None { break }; // but here we cite the whole loop
let _: i32 =
'd: //~ ERROR mismatched types
while let Some(_) = None { break };
}