My initial thought on this is that it's treating a symptom not the problem. Ultimately I think the mistake was overloading 'clone()' for Rc and Arc types. Semantically clone implies memory being duplicated, but when you clone an Rc or Arc that isn't what you're doing. You are in fact explicitly not copying memory which is the entire point. If you think of clone as semantically equivalent to malloc I think the problem becomes more apparent. Had they introduced a new trait and method for "cheaply copyable types" like Rc and Arc we wouldn't have this problem as the compiler could trivially work out anywhere it could make copies. In short there's a need for a trait that sits in between Clone and Copy. Heavier than a Copy, but significantly lighter than a Clone.
Edit: thinking a little more semantically this equates to: Copy types can be duplicated without using an allocator simply by copying bits as is. Clone types require an allocator to copy and a method call to perform book keeping. This new trait can be duplicated without an allocator but does require a method call to perform book keeping.