Can we make it so that the compiler knows that T: LikeOne will never be LikeTwo and T: LikeTwo will never be LikeOne and not cause an error? negative-impls and marker-trait-attr don't help.
I know about the overlap rules, but can't the error be triggered only after the trait for the type that causes the conflict is actually implemented? Because I really need this in my local crate, where traits are marker and not public, and I need this flexibility.
No, there's no support for mutually exclusive traits so far.
Conflicting implementation errors like the one in the playground are about SemVer compatibility -- what could be possible with a change that is considered non-major-breaking, and not just what actually exists today.
You can syntactically express some cases of this by combining the traits into a single trait with an associated constant or type. Associated items can't have two values, so they are necessarily mutually exclusive. However, the compiler doesn't yet make use of this information to observe lack of overlap; the following does not compile even with nightly features: