about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2019-12-08 20:54:54 +0900
committerYuki Okushi <huyuumi.dev@gmail.com>2019-12-09 18:55:38 +0900
commitb879ecccd0c8c79764e0feee1f6646277b44762c (patch)
treec2be4ebdf9709a9f5a5f89bbe967a4ccd2c0e3b7
parentdbbe4f10fa68105223af6096df617ebb7ca59a48 (diff)
downloadrust-b879ecccd0c8c79764e0feee1f6646277b44762c.tar.gz
rust-b879ecccd0c8c79764e0feee1f6646277b44762c.zip
Do not ICE on closure
-rw-r--r--src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs3
-rw-r--r--src/test/ui/closures/issue-67123.rs5
-rw-r--r--src/test/ui/closures/issue-67123.stderr15
3 files changed, 22 insertions, 1 deletions
diff --git a/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs b/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs
index a0f126fb2cb..252b31e4d3c 100644
--- a/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs
+++ b/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs
@@ -240,7 +240,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
                     let tcx = self.infcx.tcx;
                     let generics = tcx.generics_of(self.mir_def_id);
                     let param = generics.type_param(&param_ty, tcx);
-                    if let Some(generics) = tcx.hir().get_generics(self.mir_def_id) {
+                    if let Some(generics) =
+                        tcx.hir().get_generics(tcx.closure_base_def_id(self.mir_def_id)) {
                         suggest_constraining_type_param(
                             generics,
                             &mut err,
diff --git a/src/test/ui/closures/issue-67123.rs b/src/test/ui/closures/issue-67123.rs
new file mode 100644
index 00000000000..014c530e6d7
--- /dev/null
+++ b/src/test/ui/closures/issue-67123.rs
@@ -0,0 +1,5 @@
+fn foo<T>(t: T) {
+    || { t; t; }; //~ ERROR: use of moved value
+}
+
+fn main() {}
diff --git a/src/test/ui/closures/issue-67123.stderr b/src/test/ui/closures/issue-67123.stderr
new file mode 100644
index 00000000000..b2e875b8010
--- /dev/null
+++ b/src/test/ui/closures/issue-67123.stderr
@@ -0,0 +1,15 @@
+error[E0382]: use of moved value: `t`
+  --> $DIR/issue-67123.rs:2:13
+   |
+LL | fn foo<T>(t: T) {
+   |        - help: consider restricting this bound: `T: Copy`
+LL |     || { t; t; };
+   |          -  ^ value used here after move
+   |          |
+   |          value moved here
+   |
+   = note: move occurs because `t` has type `T`, which does not implement the `Copy` trait
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0382`.