//@ run-pass // Test method calls with self as an argument // FIXME(static_mut_refs): Do not allow `static_mut_refs` lint #![allow(static_mut_refs)] static mut COUNT: usize = 1; #[derive(Copy, Clone)] struct Foo; impl Foo { fn foo(self, x: &Foo) { unsafe { COUNT *= 2; } // Test internal call. Foo::bar(&self); Foo::bar(x); Foo::baz(self); Foo::baz(*x); Foo::qux(Box::new(self)); Foo::qux(Box::new(*x)); } fn bar(&self) { unsafe { COUNT *= 3; } } fn baz(self) { unsafe { COUNT *= 5; } } fn qux(self: Box) { unsafe { COUNT *= 7; } } } fn main() { let x = Foo; // Test external call. Foo::bar(&x); Foo::baz(x); Foo::qux(Box::new(x)); x.foo(&x); unsafe { assert_eq!(COUNT, 2*3*3*3*5*5*5*7*7*7); } }