about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-06-23 21:35:46 +0000
committerbors <bors@rust-lang.org>2021-06-23 21:35:46 +0000
commitf1e691da2e640bb45fe18f8a5bd8f7afa65ce21d (patch)
tree4bc0031e6e3e98f5fb85a57793857a294d5fe2f8 /src
parent5a7834050f3a0ebcd117b4ddf0bc1e8459594309 (diff)
parent433c1aec2195eb8864e46bf24f50f74123bbb284 (diff)
downloadrust-f1e691da2e640bb45fe18f8a5bd8f7afa65ce21d.tar.gz
rust-f1e691da2e640bb45fe18f8a5bd8f7afa65ce21d.zip
Auto merge of #86138 - FabianWolff:issue-85871, r=nikomatsakis
Check whether the closure's owner is an ADT in thir-unsafeck

This pull request fixes #85871. The code in `rustc_mir_build/src/check_unsafety.rs` incorrectly assumes that a closure's owner always has a body, but only functions, closures, and constants have bodies, whereas a closure can also appear inside a struct or enum:
```rust
struct S {
    arr: [(); match || 1 { _ => 42 }]
}

enum E {
    A([(); { || 1; 42 }])
}
```
This pull request fixes the resulting ICE by checking whether the closure's owner is an ADT and only deferring to `thir_check_unsafety(owner)` if it isn't.
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/thir-unsafeck-issue-85871.rs20
1 files changed, 20 insertions, 0 deletions
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() {}