about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_mir_build/src/check_unsafety.rs11
-rw-r--r--src/test/ui/thir-unsafeck-issue-85871.rs20
2 files changed, 28 insertions, 3 deletions
diff --git a/compiler/rustc_mir_build/src/check_unsafety.rs b/compiler/rustc_mir_build/src/check_unsafety.rs
index 4e80931ec03..9bef8ac2413 100644
--- a/compiler/rustc_mir_build/src/check_unsafety.rs
+++ b/compiler/rustc_mir_build/src/check_unsafety.rs
@@ -375,10 +375,15 @@ pub fn check_unsafety<'tcx>(tcx: TyCtxt<'tcx>, def: ty::WithOptConstParam<LocalD
         return;
     }
 
-    // Closures are handled by their parent function
+    // Closures are handled by their owner, if it has a body
     if tcx.is_closure(def.did.to_def_id()) {
-        tcx.ensure().thir_check_unsafety(tcx.hir().local_def_id_to_hir_id(def.did).owner);
-        return;
+        let owner = tcx.hir().local_def_id_to_hir_id(def.did).owner;
+        let owner_hir_id = tcx.hir().local_def_id_to_hir_id(owner);
+
+        if tcx.hir().maybe_body_owned_by(owner_hir_id).is_some() {
+            tcx.ensure().thir_check_unsafety(owner);
+            return;
+        }
     }
 
     let (thir, expr) = tcx.thir_body(def);
diff --git a/src/test/ui/thir-unsafeck-issue-85871.rs b/src/test/ui/thir-unsafeck-issue-85871.rs
new file mode 100644
index 00000000000..aea539b74df
--- /dev/null
+++ b/src/test/ui/thir-unsafeck-issue-85871.rs
@@ -0,0 +1,20 @@
+// Tests that no ICE occurs when a closure appears inside a node
+// that does not have a body when compiling with
+// compile-flags: -Zthir-unsafeck=yes
+// check-pass
+
+#![allow(dead_code)]
+
+struct Bug {
+    inner: [(); match || 1 {
+        _n => 42, // we may not call the closure here (E0015)
+    }],
+}
+
+enum E {
+    V([(); { let _ = || 1; 42 }]),
+}
+
+type Ty = [(); { let _ = || 1; 42 }];
+
+fn main() {}