]> git.lizzy.rs Git - rust.git/commitdiff
Fix an ICE with `continue` as an array length
authorvarkor <github@varkor.com>
Sat, 23 Jun 2018 10:52:45 +0000 (11:52 +0100)
committervarkor <github@varkor.com>
Sat, 23 Jun 2018 17:00:46 +0000 (18:00 +0100)
src/librustc_typeck/check/mod.rs
src/test/ui/closure-array-break-length.rs [new file with mode: 0644]
src/test/ui/closure-array-break-length.stderr [new file with mode: 0644]

index e84586520b1e4421286ac96df63d7aa1c1c56591..889073f6b4ca96a0ba5a9bfa67522c2176c73ce0 100644 (file)
@@ -3846,7 +3846,14 @@ fn check_expr_kind(&self,
                 }
 
             }
-            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 (file)
index 0000000..67feed3
--- /dev/null
@@ -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 (file)
index 0000000..a1e28e8
--- /dev/null
@@ -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`.