diff options
| author | varkor <github@varkor.com> | 2018-06-23 11:52:45 +0100 |
|---|---|---|
| committer | varkor <github@varkor.com> | 2018-06-23 18:00:46 +0100 |
| commit | f68ee0b4e14a8a7e50587bf9752fc1aa72297770 (patch) | |
| tree | b66c87971832680b11ef41fbb10cf43f78fcd517 /src | |
| parent | 4fe88c05cd14fa182fd58cc68127f98aca77d1ff (diff) | |
| download | rust-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.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/closure-array-break-length.rs | 13 | ||||
| -rw-r--r-- | src/test/ui/closure-array-break-length.stderr | 9 |
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`. |
