Move in clone impl

Hi, as you can see below, Point struct implements Copy/Clone trait, but in the clone impl I move p to _pp then return p, why the compiler doesnot error out that p is moved to _pp, thx

fn main() {
  let p1 = Point{x:1,y:2};
   
  let p2 = p1;
  p2.test();

  p1.test();
}

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

trait Test {
    fn test(&self);
}

impl Test for Point {
    fn test(&self) {
        println!("{:?}", self);
    }
}

impl Copy for Point {}

impl Clone for Point {
    fn clone(&self) -> Point {
        let p = Point{
            x: self.x+1,
            y: self.y+1,
        };
        let _pp = p;
        p
    }
}

The reason you don't get a use-after-move error is because assigning any Copy type to another variable will just copy the bits across and not logically move out of the old variable.

The documentation answers the exact question you have, and also it contains some guidelines this code violates currently.