Why is this a problem? Couldn't the erased type's vtable for Trait have a pointer to its implementation of no_receiver()? The function pointed to by the vtable shouldn't have to have a receiver, right?
let ti = TraitImplementor;
let t: &dyn Trait = &ti;
ti.no_receiver();
But I suppose that means dyn Trait has a function no_receiver() which takes itself as the receiver... which doesn't match the signature defined in Trait.
is valid, but if T = dyn Trait, there is no place to get a vtable through which the no_receiver function can be called. In principle, Rust could support a way to use this type anyway in the case where you do have a vtable, but since you couldn’t use that dyn Trait as Trait at all otherwise, it’d be quite a new thing.
I don't have the time to go detail on this... But I actually think forcing dyn Trait implementing Trait is a design mistake. At least I think we can change the rule to dyn Trait impls Trait if and only if Trait is dyn-compatible, and permit dyn Trait for all traits.