Skip to content

Commit

Permalink
Infer type ! for a loop that can only break out of other loops
Browse files Browse the repository at this point in the history
Closes #23451.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
  • Loading branch information
andersk committed Mar 18, 2015
1 parent bfac337 commit 7364022
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/librustc_typeck/check/mod.rs
Expand Up @@ -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
}
})) ||
Expand Down
21 changes: 21 additions & 0 deletions src/test/compile-fail/loop-labeled-break-value.rs
@@ -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
}
}
18 changes: 18 additions & 0 deletions src/test/run-pass/loop-labeled-break-value.rs
@@ -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 } };
}
}

0 comments on commit 7364022

Please sign in to comment.