about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-10-20 12:11:13 +0900
committerGitHub <noreply@github.com>2020-10-20 12:11:13 +0900
commit21df410a621950ee8ef50afd96a599c82c952882 (patch)
tree5515dc5c35c4fcc502f0e9a3b3b3d478e65935a7
parent3f1c637db4ba835a7a79a84566dae4a1b1e4a1ac (diff)
parent334c6c54337b2cfd367f1dd9f696ecacd9369d8d (diff)
downloadrust-21df410a621950ee8ef50afd96a599c82c952882.tar.gz
rust-21df410a621950ee8ef50afd96a599c82c952882.zip
Rollup merge of #78121 - LeSeulArtichaut:issue-78115, r=tmandry
Do not ICE on pattern that uses a binding multiple times in generator

Fixes #78115.
r? @tmandry
-rw-r--r--compiler/rustc_typeck/src/check/generator_interior.rs5
-rw-r--r--src/test/ui/issues/issue-78115.rs19
2 files changed, 20 insertions, 4 deletions
diff --git a/compiler/rustc_typeck/src/check/generator_interior.rs b/compiler/rustc_typeck/src/check/generator_interior.rs
index 3fc5f02a4a4..4473aa2081f 100644
--- a/compiler/rustc_typeck/src/check/generator_interior.rs
+++ b/compiler/rustc_typeck/src/check/generator_interior.rs
@@ -250,10 +250,7 @@ impl<'a, 'tcx> Visitor<'tcx> for InteriorVisitor<'a, 'tcx> {
             let mut scope_var_ids =
                 self.guard_bindings.pop().expect("should have pushed at least one earlier");
             for var_id in scope_var_ids.drain(..) {
-                assert!(
-                    self.guard_bindings_set.remove(&var_id),
-                    "variable should be placed in scope earlier"
-                );
+                self.guard_bindings_set.remove(&var_id);
             }
         }
         self.visit_expr(body);
diff --git a/src/test/ui/issues/issue-78115.rs b/src/test/ui/issues/issue-78115.rs
new file mode 100644
index 00000000000..ac18470c621
--- /dev/null
+++ b/src/test/ui/issues/issue-78115.rs
@@ -0,0 +1,19 @@
+// Regression test for issue #78115: "ICE: variable should be placed in scope earlier"
+
+// check-pass
+// edition:2018
+
+#[allow(dead_code)]
+struct Foo {
+    a: ()
+}
+
+async fn _bar() {
+    let foo = Foo { a: () };
+    match foo {
+        Foo { a: _a } | Foo { a: _a } if true => {}
+        _ => {}
+    }
+}
+
+fn main() {}