@pnkfelix The way I see it is that there is no real problem with an infinitely recurring drop impl, even with linear types (c.f. loop { } : ⊥). The warning exists not to prevent doing such a thing, but to prevent doing these things by mistake. As such, it is fine for it to be sloppy/overzealous (e.g. “You are dropping T in impl of Drop for T here, you might want to make sure that is intentional”). Moreover the warning can be tweaked over time without any effect on backwards compatibility.
@eddyb I would be less interested in &move if it was just needed for drop, but I feel Rust, as a systems language, really deserves to be more aware of uninitialized memory (eventually), and once you do try to give it that awareness, &out and &in/&move really demand to exist.
Under a privacy approach, the idea would be that if one can see all the fields in a type, they can effectively move it by dropping and rebuilding it. &move in the context of non-movable types is important to make a clean story on “unprivileged” code that cannot see all the fields being able to call out to a “privileged” function that consumes/moves the non-movable type. With a drop using &move, unless the drop impl wants to wipe the memory or something, that self is passed by reference and not possible by value is besides the point, and perhaps an undesirable performance hit.