FWIW, it's already possible to define a helper macro for this task:
struct Point { x: i32, y: i32 }
impl Drop for Point {
fn drop(&mut self) {
unreachable!()
}
}
let p = Point { x: 42, y: 27 };
destructuring_drop! {
let Point {
x: value,
y: _,
} = p;
}
assert_eq!(dbg!(value), 42);
By having the macro expand to the following unsafe
code:
let (value, _) = match *ManuallyDrop::new(p) {
Point { ref x, ref y } => unsafe {
(
<*const _>::read(x),
<*const _>::read(y),
)
},
};
Having the hard error become a lint (I don't care about its default polarity) seems like a less cumbersome and with-better-diagnostics way to achieve the same