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.