And even if it was Clone it would work, since impl blocks have an implicit Sized bound.
So unless where T: Clone + ?Sized was specified, this world work, too.
And Sized is a fundamental trait, which means coherence can assume the absence of str: Sized means str will never be Sized, so you don't get an "upstream may implement ... In the future" error.
as said above str is not Sized, so an implementation on a generic T with only the bound T : Clone explicitly exclude str.
to reproduce in your own code, you can do
struct MyStruct([()]); // MyStruct is not Sized
trait MyTrait {}
impl<T> MyTrait for T where T: Clone {}
impl MyTrait for MyStruct {}
btw, types that aren't Sized cannot implement Clone, but this would still work if they could.
an example with Debug :
use std::fmt::Debug;
#[derive(Debug)]
struct MyStruct([()]);
trait MyTrait {}
impl<T> MyTrait for T where T: Debug {}
impl MyTrait for MyStruct {}
here MyStruct does implement Debug, but it does not implement Sized, so it is not affected by the blanket impl
interestingly, the following still works, because Sized is a supertrait of Clone
struct MyStruct([()]); // MyStruct is not Sized
trait MyTrait {}
impl<T : ?Sized> MyTrait for T where T: Clone {}
impl MyTrait for MyStruct {}
so the ?Sized is ignored.
but
use std::fmt::Debug;
#[derive(Debug)]
struct MyStruct([()]); // MyStruct is not Sized
trait MyTrait {}
impl<T : ?Sized> MyTrait for T where T: Debug {}
impl MyTrait for MyStruct {} // conflict with the above
does not work because here the blanket impl does cover MyStruct