I'm surprised by the ambiguity shown in the last example. Shouldn't the concrete return type for an impl Into<u32> be completely inaccessible outside of the function? Otherwise it would allow to introduce breaking changes without changing a function API.
But in this case, how would it be possible that impl_trait().into() is an u16?