Rust doesn't implement Clone except through the derive mechanism, and what could it do except call Clone on everything recursively? If you do it yourself, there's obviously no guarantees regardless if it is Copy, because you can make Clone do whatever you want.
At the bottom of that recursion, Clone for Copy types is usually implemented as a copy. See here for instance. It's also #[inline], so the clone method shouldn't even be called.
The purpose of the copy trait is to just be a marker that says clone is cheap, with some other details added on that affect how those types can be used. You don't have to worry at all about which implementation gets used when you need to duplicate it, it'll do the smart thing.
That is a very interesting situation. It feels like the compiler should somehow forbid a programmer from doing that, but they didn't so I guess there must have been a good reason. What situation could possibly exist where a type that is copy+clone would need to two different ways of duplicating itself?
It's because there's no mechanism in the language that you could use to prevent you from weird Clone implementations. Disallowing it would be require a new language feature or some special-cased code in the compiler that specifically disallows it.
This is an example where, for Wrapper<T> : Copy, the Clone impl of Wrapper<T> is not the *self "default" bit-copy: it is actually overridden with the Wrapper(self.0.clone()) instead. Assuming the inner self.0.clone() behaves, that overridden impl ought to be a bit-copy and so everything is a bit copy and all is good. But it's still "hard" for the language to allow these necessary derive impls while also forbidding the buggy ones.
And in the general case, mathematically impossible for the compiler to catch every possible case. The compiler could special case the most common cases, but whether it should is a different discussion.
Option<T> is a real-world example of this. There was an attempt to use specialization to make the optimized Clone work as a Copy, but that stalled out.
Isn't this implementation the same that is generated with #[derive(Clone)]? If it is, why compiler cannot forbid manual impl of Clone if there also exists some impl (derived or manual) of Copy?
Well, for starters, derives are supposed to be Just Sugar™ for something that one should always be able to manually write.
That being said, there is (an annoying) precedent for derive having a special capability: PartialEq, Eq. Indeed, these are required to be derived in order for constants of that type to be usable as "literal patterns": such patterns will perform comparisons matching "structural equality" semantics, which would otherwise be susceptible not to match the "semantic equality" that a manual impl of PartialEq would cause.
Given that precedent, I guess forbidding manual impls for that case could be acceptable, if it weren't for the current implementation of the derives being a bit dumb.