about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-07-01 17:23:48 +0100
committervarkor <github@varkor.com>2018-07-02 19:43:16 +0100
commitc6bbee802abb174243fac490782baa680e4f67b4 (patch)
tree9ae26e560151fe6dab94d8b64250c6e19df0455d
parentb58b7219218f1862219e5d4d720174896f184989 (diff)
downloadrust-c6bbee802abb174243fac490782baa680e4f67b4.tar.gz
rust-c6bbee802abb174243fac490782baa680e4f67b4.zip
Fix a bug with return in anonymous consts
-rw-r--r--src/librustc_typeck/check/writeback.rs12
-rw-r--r--src/test/ui/issue-51714.rs5
-rw-r--r--src/test/ui/issue-51714.stderr8
3 files changed, 17 insertions, 8 deletions
diff --git a/src/librustc_typeck/check/writeback.rs b/src/librustc_typeck/check/writeback.rs
index f7d1e407945..2445cae9860 100644
--- a/src/librustc_typeck/check/writeback.rs
+++ b/src/librustc_typeck/check/writeback.rs
@@ -257,13 +257,11 @@ impl<'cx, 'gcx, 'tcx> Visitor<'gcx> for WritebackCx<'cx, 'gcx, 'tcx> {
     fn visit_pat(&mut self, p: &'gcx hir::Pat) {
         match p.node {
             hir::PatKind::Binding(..) => {
-                let bm = *self.fcx
-                    .tables
-                    .borrow()
-                    .pat_binding_modes()
-                    .get(p.hir_id)
-                    .expect("missing binding mode");
-                self.tables.pat_binding_modes_mut().insert(p.hir_id, bm);
+                if let Some(&bm) = self.fcx.tables.borrow().pat_binding_modes().get(p.hir_id) {
+                    self.tables.pat_binding_modes_mut().insert(p.hir_id, bm);
+                } else {
+                    self.tcx().sess.delay_span_bug(p.span, "missing binding mode");
+                }
             }
             hir::PatKind::Struct(_, ref fields, _) => {
                 for field in fields {
diff --git a/src/test/ui/issue-51714.rs b/src/test/ui/issue-51714.rs
index 96c5b92ddfd..c0e62dcc9ce 100644
--- a/src/test/ui/issue-51714.rs
+++ b/src/test/ui/issue-51714.rs
@@ -17,3 +17,8 @@ fn foo() {
     [(); return || {}];
     //~^ ERROR return statement outside of function body
 }
+
+fn bar() {
+    [(); return |ice| {}];
+    //~^ ERROR return statement outside of function body
+}
diff --git a/src/test/ui/issue-51714.stderr b/src/test/ui/issue-51714.stderr
index 746adea6b7e..3e61df8062d 100644
--- a/src/test/ui/issue-51714.stderr
+++ b/src/test/ui/issue-51714.stderr
@@ -10,6 +10,12 @@ error[E0572]: return statement outside of function body
 LL |     [(); return || {}];
    |          ^^^^^^^^^^^^
 
-error: aborting due to 2 previous errors
+error[E0572]: return statement outside of function body
+  --> $DIR/issue-51714.rs:22:10
+   |
+LL |     [(); return |ice| {}];
+   |          ^^^^^^^^^^^^^^^
+
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0572`.