about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-10-07 00:16:05 +0200
committerGitHub <noreply@github.com>2020-10-07 00:16:05 +0200
commit83c58d6fb6469f57cb9a7b0d5de34f1567892653 (patch)
tree0a15964f4533bb02546208a67cf0979f7539a5da /src
parenta7a75b908a7fa0750d21ddd3934a173161c21503 (diff)
parentdaf48b82abd87b6f2016881528be2e978fd5def7 (diff)
downloadrust-83c58d6fb6469f57cb9a7b0d5de34f1567892653.tar.gz
rust-83c58d6fb6469f57cb9a7b0d5de34f1567892653.zip
Rollup merge of #77568 - lcnr:mir-inline-def-id, r=ecstatic-morse
inliner: use caller param_env

We used the callee param env instead of the caller param env by accident in #77430, this PR fixes that and caches it in the `Inliner` struct.

fixes #77564

r? @ecstatic-morse
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-77564.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77564.rs b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
new file mode 100644
index 00000000000..262402df2cc
--- /dev/null
+++ b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
@@ -0,0 +1,38 @@
+// run-pass
+// compile-flags:-Zmir-opt-level=2
+
+use std::mem::MaybeUninit;
+const N: usize = 2;
+
+trait CollectArray<A>: Iterator<Item = A> {
+    fn inner_array(&mut self) -> [A; N];
+    fn collect_array(&mut self) -> [A; N] {
+        let result = self.inner_array();
+        assert!(self.next().is_none());
+        result
+    }
+}
+
+impl<A, I: ?Sized> CollectArray<A> for I
+where
+    I: Iterator<Item = A>,
+{
+    fn inner_array(&mut self) -> [A; N] {
+        let mut result: [MaybeUninit<A>; N] = unsafe { MaybeUninit::uninit().assume_init() };
+        for (dest, item) in result.iter_mut().zip(self) {
+            *dest = MaybeUninit::new(item);
+        }
+        let temp_ptr: *const [MaybeUninit<A>; N] = &result;
+        unsafe { std::ptr::read(temp_ptr as *const [A; N]) }
+    }
+}
+
+fn main() {
+    assert_eq!(
+        [[1, 2], [3, 4]]
+            .iter()
+            .map(|row| row.iter().collect_array())
+            .collect_array(),
+        [[&1, &2], [&3, &4]]
+    );
+}