struct Foo { f: isize, } impl Foo { fn foo(self: isize, x: isize) -> isize { //~^ ERROR invalid `self` parameter type self.f + x } } struct Bar { f: T, } impl Bar { fn foo(self: Bar, x: isize) -> isize { //~^ ERROR invalid `self` parameter type x } fn bar(self: &Bar, x: isize) -> isize { //~^ ERROR invalid `self` parameter type x } } trait SomeTrait { fn dummy1(&self); fn dummy2(&self); fn dummy3(&self); } impl<'a, T> SomeTrait for &'a Bar { fn dummy1(self: &&'a Bar) { } fn dummy2(self: &Bar) {} //~ ERROR mismatched `self` parameter type //~^ ERROR mismatched `self` parameter type fn dummy3(self: &&Bar) {} //~^ ERROR mismatched `self` parameter type //~| expected reference `&'a Bar` //~| found reference `&Bar` //~| lifetime mismatch //~| ERROR mismatched `self` parameter type //~| expected reference `&'a Bar` //~| found reference `&Bar` //~| lifetime mismatch } fn main() { let foo = Box::new(Foo { f: 1, }); println!("{}", foo.foo(2)); let bar = Box::new(Bar { f: 1, }); println!("{} {}", bar.foo(2), bar.bar(2)); }