about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-06-23 11:00:43 +0000
committerbors <bors@rust-lang.org>2018-06-23 11:00:43 +0000
commita51e8071366474e80976eb7e487c0012b435dcef (patch)
tree5bcad04ff8be1672f451e3ec313d18691ecf0f0a
parent56e8f29dbe89f2109cacc8eb5e92ea3de32eefb9 (diff)
parent8ddf9a3360a3be0831141c714c51ad5b655c56fd (diff)
downloadrust-a51e8071366474e80976eb7e487c0012b435dcef.tar.gz
rust-a51e8071366474e80976eb7e487c0012b435dcef.zip
Auto merge of #51723 - estebank:abolish-ice, r=oli-obk
Accept `TyError` in `analyze_closure` to avoid ICE

Fix #51714.
-rw-r--r--src/librustc_typeck/check/upvar.rs4
-rw-r--r--src/test/ui/issue-51714.rs19
-rw-r--r--src/test/ui/issue-51714.stderr15
3 files changed, 38 insertions, 0 deletions
diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs
index cfb9c2a5062..e24269bca57 100644
--- a/src/librustc_typeck/check/upvar.rs
+++ b/src/librustc_typeck/check/upvar.rs
@@ -111,6 +111,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
         let (closure_def_id, substs) = match self.node_ty(closure_hir_id).sty {
             ty::TyClosure(def_id, substs) => (def_id, UpvarSubsts::Closure(substs)),
             ty::TyGenerator(def_id, substs, _) => (def_id, UpvarSubsts::Generator(substs)),
+            ty::TyError => {
+                // #51714: skip analysis when we have already encountered type errors
+                return;
+            }
             ref t => {
                 span_bug!(
                     span,
diff --git a/src/test/ui/issue-51714.rs b/src/test/ui/issue-51714.rs
new file mode 100644
index 00000000000..96c5b92ddfd
--- /dev/null
+++ b/src/test/ui/issue-51714.rs
@@ -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() {
+    |_:  [_; return || {}] | {}
+    //~^ ERROR return statement outside of function body
+}
+
+fn foo() {
+    [(); return || {}];
+    //~^ ERROR return statement outside of function body
+}
diff --git a/src/test/ui/issue-51714.stderr b/src/test/ui/issue-51714.stderr
new file mode 100644
index 00000000000..746adea6b7e
--- /dev/null
+++ b/src/test/ui/issue-51714.stderr
@@ -0,0 +1,15 @@
+error[E0572]: return statement outside of function body
+  --> $DIR/issue-51714.rs:12:14
+   |
+LL |     |_:  [_; return || {}] | {}
+   |              ^^^^^^^^^^^^
+
+error[E0572]: return statement outside of function body
+  --> $DIR/issue-51714.rs:17:10
+   |
+LL |     [(); return || {}];
+   |          ^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0572`.