struct Point { x: int, y: int, } impl Point : ops::Add { pure fn add(&&z: int) -> int { self.x + self.y + z } } impl Point { fn times(z: int) -> int { self.x * self.y * z } } fn a() { let mut p = Point {x: 3, y: 4}; // ok (we can loan out rcvr) p + 3; p.times(3); } fn b() { let mut p = Point {x: 3, y: 4}; // Here I create an outstanding loan and check that we get conflicts: let q = &mut p; //~ NOTE prior loan as mutable granted here //~^ NOTE prior loan as mutable granted here p + 3; //~ ERROR loan of mutable local variable as immutable conflicts with prior loan p.times(3); //~ ERROR loan of mutable local variable as immutable conflicts with prior loan q.x += 1; } fn c() { // Here the receiver is in aliased memory and hence we cannot // consider it immutable: let q = @mut Point {x: 3, y: 4}; // ...this is ok for pure fns *q + 3; // ...but not impure fns (*q).times(3); //~ ERROR illegal borrow unless pure: creating immutable alias to aliasable, mutable memory //~^ NOTE impure due to access to impure function } fn main() { }