Closed
Description
Given the following code: https://godbolt.org/z/zK79rccxf
use std::mem::MaybeUninit;
use std::pin::Pin;
unsafe fn f(x: Pin<&mut MaybeUninit<i32>>) {
x.map_unchecked_mut(MaybeUninit::assume_init_mut);
}
The current output is:
error[E0277]: expected a `FnOnce<(&mut MaybeUninit<i32>,)>` closure, found `for<'r> unsafe fn(&'r mut MaybeUninit<_>) -> &'r mut _ {MaybeUninit::<_>::assume_init_mut}`
--> <source>:5:25
|
5 | x.map_unchecked_mut(MaybeUninit::assume_init_mut);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected an `FnOnce<(&mut MaybeUninit<i32>,)>` closure, found `for<'r> unsafe fn(&'r mut MaybeUninit<_>) -> &'r mut _ {MaybeUninit::<_>::assume_init_mut}`
|
= help: the trait `for<'r> FnOnce<(&'r mut MaybeUninit<i32>,)>` is not implemented for `for<'r> unsafe fn(&'r mut MaybeUninit<_>) -> &'r mut _ {MaybeUninit::<_>::assume_init_mut}`
error: aborting due to previous error
This error is a bit difficult, since it does not give the user the essential information: assume_init_mut
is unsafe, and therefore cannot be turned into a Fn* trait. Ideally, the compiler would point this out, and suggest a rewrite into a closure like |x| x.assume_init_mut()
(plus or minus an unsafe {}
block as context requires).