diff options
| author | Fabian Wolff <fabian.wolff@alumni.ethz.ch> | 2021-06-08 17:19:16 +0200 |
|---|---|---|
| committer | Fabian Wolff <fabian.wolff@alumni.ethz.ch> | 2021-06-08 22:09:35 +0200 |
| commit | 433c1aec2195eb8864e46bf24f50f74123bbb284 (patch) | |
| tree | bb6cc5b3cf0a26f0e20d37e501bb66c1e3ae9daf | |
| parent | a50d72158e08e02cfc051b863017bdbd2c45b637 (diff) | |
| download | rust-433c1aec2195eb8864e46bf24f50f74123bbb284.tar.gz rust-433c1aec2195eb8864e46bf24f50f74123bbb284.zip | |
Check whether the closure's owner has a body before deferring to it in thir-unsafeck
| -rw-r--r-- | compiler/rustc_mir_build/src/check_unsafety.rs | 11 | ||||
| -rw-r--r-- | src/test/ui/thir-unsafeck-issue-85871.rs | 20 |
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 2d52577829c..72a55909e15 100644 --- a/compiler/rustc_mir_build/src/check_unsafety.rs +++ b/compiler/rustc_mir_build/src/check_unsafety.rs @@ -368,10 +368,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() {} |
