Infer type ! for a loop that can only break out of other loops

Closes #23451.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
This commit is contained in:
Anders Kaseorg 2015-03-18 01:19:53 -04:00
parent bfac337daa
commit 7364022e7a
3 changed files with 40 additions and 1 deletions

View file

@ -5239,7 +5239,7 @@ pub fn may_break(cx: &ty::ctxt, id: ast::NodeId, b: &ast::Block) -> bool {
// inside the loop?
(loop_query(&*b, |e| {
match *e {
ast::ExprBreak(_) => true,
ast::ExprBreak(None) => true,
_ => false
}
})) ||

View file

@ -0,0 +1,21 @@
// Copyright 2015 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.
fn main() {
loop {
let _: i32 = loop { break }; //~ ERROR mismatched types
}
loop {
let _: i32 = 'inner: loop { break 'inner }; //~ ERROR mismatched types
}
loop {
let _: i32 = 'inner: loop { loop { break 'inner } }; //~ ERROR mismatched types
}
}

View file

@ -0,0 +1,18 @@
// Copyright 2015 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.
fn main() {
'outer: loop {
let _: i32 = loop { break 'outer };
}
'outer: loop {
let _: i32 = loop { loop { break 'outer } };
}
}