let ctxt = BreakableCtxt {
// cannot use break with a value from a while loop
coerce: None,
- may_break: true,
+ may_break: false, // Will get updated if/when we find a `break`.
};
- self.with_breakable_ctxt(expr.id, ctxt, || {
+ let (ctxt, ()) = self.with_breakable_ctxt(expr.id, ctxt, || {
self.check_expr_has_type_or_error(&cond, tcx.types.bool);
let cond_diverging = self.diverges.get();
self.check_block_no_value(&body);
self.diverges.set(cond_diverging);
});
+ if ctxt.may_break {
+ // No way to know whether it's diverging because
+ // of a `break` or an outer `break` or `return`.
+ self.diverges.set(Diverges::Maybe);
+ }
+
self.tcx.mk_nil()
}
hir::ExprLoop(ref body, _, source) => {
let ctxt = BreakableCtxt {
coerce,
- may_break: false, // will get updated if/when we find a `break`
+ may_break: false, // Will get updated if/when we find a `break`.
};
let (ctxt, ()) = self.with_breakable_ctxt(expr.id, ctxt, || {
if ctxt.may_break {
// No way to know whether it's diverging because
- // of a `break` or an outer `break` or `return.
+ // of a `break` or an outer `break` or `return`.
self.diverges.set(Diverges::Maybe);
}
--- /dev/null
+// Copyright 2018 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.
+
+#![feature(never_type)]
+
+fn main() {
+ let _: ! = { //~ ERROR mismatched types
+ 'a: while break 'a {};
+ };
+}
--- /dev/null
+error[E0308]: mismatched types
+ --> $DIR/break-while-condition.rs:14:16
+ |
+LL | let _: ! = { //~ ERROR mismatched types
+ | ________________^
+LL | | 'a: while break 'a {};
+LL | | };
+ | |_____^ expected !, found ()
+ |
+ = note: expected type `!`
+ found type `()`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.