I didn’t have time to write this up anywhere, but I came up with a simpler system a few days ago:
#[lang="interior"]
struct Interior<T>(T);
impl<T> Interior<T> {
unsafe fn of(x: T) -> Interior<T> {
Interior(x)
}
}
#[lang="drop"]
trait Drop {
fn drop(self: Interior<Self>);
}
Interior<T>
would provide field access and pattern-matching as if it were T
, but otherwise act like a different type entirely, e.g. it has none of the methods implemented on T
.
It wouldn’t have Drop
implemented on it, so dropping Interior<T>
will only destroy the fields, but won’t call T
's Drop
implementation, solving the infinite drop recursion issue.
We can also remove the restriction on calling Drop::drop
directly, since it needs Interior<T>
and that’s unsafe to get from T
.
Personally, I think DropPtr
is an unnecessary complication and I won’t support it.
Linear types don’t need the ability, but I am sympathetic to finally fixing Drop
, if we don’t make it worse.