See: rust-lang/rust#108684 and this zulip discussion
Firstly, let's assume that ManuallyDrop::drop() is equivalent to ptr::drop_in_place() since the docs claim they are.
ManuallyDrop::drop() makes an interesting claim:
Other than changes made by the destructor itself, the memory is left unchanged, and so as far as the compiler is concerned still holds a bit-pattern which is valid for the type T.
This can be parsed in two ways:
(Other than changes made by the destructor itself, the memory is left unchanged), and so as far as the compiler is concerned still holds a bit-pattern which is valid for the type T.
and
Other than changes made by the destructor itself, (the memory is left unchanged, and so as far as the compiler is concerned still holds a bit-pattern which is valid for the type T.)
The question becomes: is Drop::drop() allowed to invalidate the type? Is it fine for its body to be *self = uninit or e.g. for a bool something like *self = transmute(73)?
This has different implications in a world with shallow vs deep validity (#77), because if there is deep validity this means that it might be insta-UB to pass an &mut T to ptr::drop_in_place() (otoh it might be insta-UB to write a Drop impl that invalidates its own &mut self, so it still could be okay, depending on precisely how long validity is supposed to last)
As it currently stands with the ambiguity, the note of "as far as the compiler is concerned still holds a bit-pattern which is valid for the type T." is not really useful. We should figure out what it means, and clarify the docs to say so.
See: rust-lang/rust#108684 and this zulip discussion
Firstly, let's assume that
ManuallyDrop::drop()is equivalent toptr::drop_in_place()since the docs claim they are.ManuallyDrop::drop()makes an interesting claim:This can be parsed in two ways:
and
The question becomes: is
Drop::drop()allowed to invalidate the type? Is it fine for its body to be*self = uninitor e.g. for aboolsomething like*self = transmute(73)?This has different implications in a world with shallow vs deep validity (#77), because if there is deep validity this means that it might be insta-UB to pass an
&mut Ttoptr::drop_in_place()(otoh it might be insta-UB to write aDropimpl that invalidates its own&mut self, so it still could be okay, depending on precisely how long validity is supposed to last)As it currently stands with the ambiguity, the note of "as far as the compiler is concerned still holds a bit-pattern which is valid for the type T." is not really useful. We should figure out what it means, and clarify the docs to say so.