]> git.lizzy.rs Git - rust.git/commitdiff
Fix an ICE using break and continue as array lengths
authorvarkor <github@varkor.com>
Sun, 1 Jul 2018 16:24:07 +0000 (17:24 +0100)
committervarkor <github@varkor.com>
Mon, 2 Jul 2018 18:43:16 +0000 (19:43 +0100)
src/librustc_driver/driver.rs
src/librustc_mir/build/scope.rs
src/librustc_passes/loops.rs
src/test/ui/array-break-length.rs [new file with mode: 0644]
src/test/ui/array-break-length.stderr [new file with mode: 0644]
src/test/ui/closure-array-break-length.rs
src/test/ui/closure-array-break-length.stderr

index feeac9d938b6a4b01a352293d6fa54b0a355d2b6..c4e196628915b42f1d0fa377d3109d1763b0a1bb 100644 (file)
@@ -1211,6 +1211,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(
         .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);
index b9d6486d9174a9117ca38c11d7aed88c4567fb17..502091e5192012872f41b15386ca76ae26ae4eba 100644 (file)
@@ -541,9 +541,9 @@ pub fn new_source_scope(&mut self,
     /// 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()
index c99f1e9da439f04ce9b3133814123ed977511745..898acf48d3df82a28d29f7f31c7197bc71d2ca48 100644 (file)
@@ -40,6 +40,7 @@ enum Context {
     Loop(LoopKind),
     Closure,
     LabeledBlock,
+    AnonConst,
 }
 
 #[derive(Copy, Clone)]
@@ -71,6 +72,10 @@ fn visit_impl_item(&mut self, i: &'hir hir::ImplItem) {
         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, _) => {
@@ -194,7 +199,7 @@ fn require_break_cx(&self, name: &str, span: Span) {
                 .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();
diff --git a/src/test/ui/array-break-length.rs b/src/test/ui/array-break-length.rs
new file mode 100644 (file)
index 0000000..c3cfff0
--- /dev/null
@@ -0,0 +1,19 @@
+// 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
+    }
+}
diff --git a/src/test/ui/array-break-length.stderr b/src/test/ui/array-break-length.stderr
new file mode 100644 (file)
index 0000000..114245b
--- /dev/null
@@ -0,0 +1,15 @@
+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`.
index 2e99921956ab295b1f89dc4bdfe798b7d0bb39aa..727113e328fef1db1563e8170d4d0714df513e3c 100644 (file)
@@ -12,6 +12,8 @@ fn main() {
     |_: [_; 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
 }
index 139153992e27402d8a1fd1636ceaff4cd17c17bd..a337645fb7e8fc5dcf25c93c4417b5787b5f40cc 100644 (file)
@@ -10,13 +10,25 @@ error[E0590]: `break` or `continue` with no label in the condition of a `while`
 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`.