about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-06-23 11:52:45 +0100
committervarkor <github@varkor.com>2018-06-23 18:00:46 +0100
commitf68ee0b4e14a8a7e50587bf9752fc1aa72297770 (patch)
treeb66c87971832680b11ef41fbb10cf43f78fcd517 /src
parent4fe88c05cd14fa182fd58cc68127f98aca77d1ff (diff)
downloadrust-f68ee0b4e14a8a7e50587bf9752fc1aa72297770.tar.gz
rust-f68ee0b4e14a8a7e50587bf9752fc1aa72297770.zip
Fix an ICE with `continue` as an array length
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/check/mod.rs9
-rw-r--r--src/test/ui/closure-array-break-length.rs13
-rw-r--r--src/test/ui/closure-array-break-length.stderr9
3 files changed, 30 insertions, 1 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index e84586520b1..889073f6b4c 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -3846,7 +3846,14 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                 }
 
             }
-            hir::ExprContinue(_) => { tcx.types.never }
+            hir::ExprContinue(destination) => {
+                if let Ok(_) = destination.target_id {
+                    tcx.types.never
+                } else {
+                    // There was an error, make typecheck fail
+                    tcx.types.err
+                }
+            }
             hir::ExprRet(ref expr_opt) => {
                 if self.ret_coercion.is_none() {
                     struct_span_err!(self.tcx.sess, expr.span, E0572,
diff --git a/src/test/ui/closure-array-break-length.rs b/src/test/ui/closure-array-break-length.rs
new file mode 100644
index 00000000000..67feed38b6c
--- /dev/null
+++ b/src/test/ui/closure-array-break-length.rs
@@ -0,0 +1,13 @@
+// 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() {
+    |_: [_; continue]| {}; //~ ERROR: `continue` outside of loop
+}
diff --git a/src/test/ui/closure-array-break-length.stderr b/src/test/ui/closure-array-break-length.stderr
new file mode 100644
index 00000000000..a1e28e84ced
--- /dev/null
+++ b/src/test/ui/closure-array-break-length.stderr
@@ -0,0 +1,9 @@
+error[E0268]: `continue` outside of loop
+  --> $DIR/closure-array-break-length.rs:12:13
+   |
+LL |     |_: [_; continue]| {}; //~ ERROR: `continue` outside of loop
+   |             ^^^^^^^^ cannot break outside of a loop
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0268`.