Maybe the use of unsafe can become more precise? (Not sure if that’ll quite retain the right semantics.)
E.g. I believe in p { f() } becomes something like:
let mut place = p.make_place();
let ptr = place.pointer();
unsafe {
ptr::write(ptr, f());
place.finalize()
}
but maybe it could become
let mut place = p.make_place();
let ptr = place.pointer();
let val = f(); // pulled out of the `unsafe`
unsafe {
ptr::write(ptr, val);
place.finalize()
}