Assuming we have trait implementations like:
impl Deleter for unsafe fn(*mut u8) {
fn delete<T>(&mut self, ptr: *mut u8) {
unsafe {
(*self)(ptr)
}
}
}
impl<F: FnMut(*mut u8)> Deleter for F {
fn delete<T>(&mut self, ptr: *mut u8) {
(*self)(ptr)
}
}
When we try to pass function like:
pub unsafe fn default_deleter<T>(ptr: *mut u8) {
alloc::boxed::Box::from_raw(ptr as *mut T);
}
Would result in selecting FnMut
implementation, not unsafe fn
Does it looke like an oversight?
From my perspective even type bound fn
is still fn
.
When compiling generic that accepts Deleter
:
error[E0277]: expected a `std::ops::FnMut<(*mut u8,)>` closure, found `unsafe fn(*mut u8) {smart_ptr::default_deleter::<should_dtor_global::MyDeleter<'_>>}`
--> tests\unique.rs:64:66
|
64 | Unique::new(Box::leak(var) as *mut MyDeleter as *mut u8, smart_ptr::default_deleter::<MyDeleter>);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected an `FnMut<(*mut u8,)>` closure, found `unsafe fn(*mut u8) {smart_ptr::default_deleter::<should_dtor_global::MyDeleter<'_>>}`
|