.set(derive_registrar::find(&hir_map));
time(sess, "loop checking", || loops::check_crate(sess, &hir_map));
+ sess.abort_if_errors();
let mut local_providers = ty::query::Providers::default();
default_provide(&mut local_providers);
/// Finds the breakable scope for a given label. This is used for
/// resolving `break` and `continue`.
pub fn find_breakable_scope(&self,
- span: Span,
- label: region::Scope)
- -> &BreakableScope<'tcx> {
+ span: Span,
+ label: region::Scope)
+ -> &BreakableScope<'tcx> {
// find the loop-scope with the correct id
self.breakable_scopes.iter()
.rev()
Loop(LoopKind),
Closure,
LabeledBlock,
+ AnonConst,
}
#[derive(Copy, Clone)]
self.with_context(Normal, |v| intravisit::walk_impl_item(v, i));
}
+ fn visit_anon_const(&mut self, c: &'hir hir::AnonConst) {
+ self.with_context(AnonConst, |v| intravisit::walk_anon_const(v, c));
+ }
+
fn visit_expr(&mut self, e: &'hir hir::Expr) {
match e.node {
hir::ExprWhile(ref e, ref b, _) => {
.span_label(span, "cannot break inside of a closure")
.emit();
}
- Normal => {
+ Normal | AnonConst => {
struct_span_err!(self.sess, span, E0268, "`{}` outside of loop", name)
.span_label(span, "cannot break outside of a loop")
.emit();
--- /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.
+
+fn main() {
+ loop {
+ |_: [_; break]| {} //~ ERROR: `break` outside of loop
+ }
+
+ loop {
+ |_: [_; continue]| {} //~ ERROR: `continue` outside of loop
+ }
+}
--- /dev/null
+error[E0268]: `break` outside of loop
+ --> $DIR/array-break-length.rs:13:17
+ |
+LL | |_: [_; break]| {} //~ ERROR: `break` outside of loop
+ | ^^^^^ cannot break outside of a loop
+
+error[E0268]: `continue` outside of loop
+ --> $DIR/array-break-length.rs:17:17
+ |
+LL | |_: [_; continue]| {} //~ ERROR: `continue` outside of loop
+ | ^^^^^^^^ cannot break outside of a loop
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0268`.
|_: [_; continue]| {}; //~ ERROR: `continue` outside of loop
while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
+ //~^ ERROR: `continue` outside of loop
while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
+ //~^ ERROR: `break` outside of loop
}
LL | while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
| ^^^^^^^^ unlabeled `continue` in the condition of a `while` loop
+error[E0268]: `continue` outside of loop
+ --> $DIR/closure-array-break-length.rs:14:19
+ |
+LL | while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
+ | ^^^^^^^^ cannot break outside of a loop
+
error[E0590]: `break` or `continue` with no label in the condition of a `while` loop
- --> $DIR/closure-array-break-length.rs:16:19
+ --> $DIR/closure-array-break-length.rs:17:19
|
LL | while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
| ^^^^^ unlabeled `break` in the condition of a `while` loop
-error: aborting due to 3 previous errors
+error[E0268]: `break` outside of loop
+ --> $DIR/closure-array-break-length.rs:17:19
+ |
+LL | while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
+ | ^^^^^ cannot break outside of a loop
+
+error: aborting due to 5 previous errors
Some errors occurred: E0268, E0590.
For more information about an error, try `rustc --explain E0268`.