diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-10-07 00:16:05 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-07 00:16:05 +0200 |
| commit | 83c58d6fb6469f57cb9a7b0d5de34f1567892653 (patch) | |
| tree | 0a15964f4533bb02546208a67cf0979f7539a5da /src | |
| parent | a7a75b908a7fa0750d21ddd3934a173161c21503 (diff) | |
| parent | daf48b82abd87b6f2016881528be2e978fd5def7 (diff) | |
| download | rust-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.rs | 38 |
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]] + ); +} |
