That's it. I just wrote a custom MyFrom/MyInto trait to test it.
Now I am wondering what could be improved in the type system to deal with such constraints.
It's possible for a type F to implement Fn() -> F, for which both impls in the initial post apply, so they actually overlap. What should happen in that case?
The overlap isn't a false positive, FWIW. fn fake_val<T> -> T { unimplemented!() } can theoretically be the recursive type F = fn() -> F.
Actually creating that monomorphization might not be possible, but the type is legal. And the general case for implementable traits is trivial to construct; just do impl Trait for T { type Output = Self; }.
I usually think of x.into() as not losing any information about x, but Fn() -> T isn't just a lazy T because you can do things with interior mutability.