|  | //@ revisions: default feature | 
|  | #![cfg_attr(feature, feature(arbitrary_self_types))] | 
|  |  | 
|  | use std::ops::Deref; | 
|  | use std::marker::PhantomData; | 
|  |  | 
|  | struct Foo(u32); | 
|  | impl Foo { | 
|  | fn get<R: Deref<Target = Self>>(self: R) -> u32 { | 
|  | //~^ ERROR: invalid generic `self` parameter type | 
|  | self.0 | 
|  | } | 
|  | fn get1<R: Deref<Target = Self>>(self: &R) -> u32 { | 
|  | //~^ ERROR: invalid generic `self` parameter type | 
|  | self.0 | 
|  | } | 
|  | fn get2<R: Deref<Target = Self>>(self: &mut R) -> u32 { | 
|  | //~^ ERROR: invalid generic `self` parameter type | 
|  | self.0 | 
|  | } | 
|  | fn get3<R: Deref<Target = Self>>(self: std::rc::Rc<R>) -> u32 { | 
|  | //~^ ERROR: invalid generic `self` parameter type | 
|  | self.0 | 
|  | } | 
|  | fn get4<R: Deref<Target = Self>>(self: &std::rc::Rc<R>) -> u32 { | 
|  | //~^ ERROR: invalid generic `self` parameter type | 
|  | self.0 | 
|  | } | 
|  | fn get5<R: Deref<Target = Self>>(self: std::rc::Rc<&R>) -> u32 { | 
|  | //~^ ERROR: invalid generic `self` parameter type | 
|  | self.0 | 
|  | } | 
|  | fn get6<FR: FindReceiver>(self: FR::Receiver, other: FR) -> u32 { | 
|  | //[default]~^ ERROR: `<FR as FindReceiver>::Receiver` cannot be used as the type of `self` | 
|  | 42 | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | struct SmartPtr<'a, T: ?Sized>(&'a T); | 
|  |  | 
|  | impl<'a, T: ?Sized> Deref for SmartPtr<'a, T> { | 
|  | type Target = T; | 
|  | fn deref(&self) -> &Self::Target { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  |  | 
|  | struct SmartPtr2<'a, T: ?Sized>(&'a T); | 
|  |  | 
|  | impl<'a, T: ?Sized> Deref for SmartPtr2<'a, T> { | 
|  | type Target = T; | 
|  | fn deref(&self) -> &Self::Target { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  |  | 
|  | struct Bar<R>(std::marker::PhantomData<R>); | 
|  |  | 
|  | impl<R: std::ops::Deref<Target = Self>> Bar<R> { | 
|  | fn get(self: R) {} | 
|  | //[default]~^ ERROR: `R` cannot be used as the type of `self` | 
|  | } | 
|  |  | 
|  | trait FindReceiver { | 
|  | type Receiver: Deref<Target = Foo>; | 
|  | } | 
|  |  | 
|  | struct Silly; | 
|  | impl FindReceiver for Silly { | 
|  | type Receiver = std::rc::Rc<Foo>; | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | let mut foo = Foo(1); | 
|  | foo.get::<&Foo>(); | 
|  | //[feature]~^ ERROR mismatched types | 
|  | foo.get::<std::rc::Rc<Foo>>(); | 
|  | //[feature]~^ ERROR mismatched types | 
|  |  | 
|  | let smart_ptr = SmartPtr(&foo); | 
|  | let smart_ptr2 = SmartPtr2(&foo); | 
|  | smart_ptr.get(); // this compiles | 
|  | smart_ptr.get::<SmartPtr2<Foo>>(); | 
|  | //[feature]~^ ERROR mismatched types | 
|  | smart_ptr.get::<&Foo>(); | 
|  | //[feature]~^ ERROR mismatched types | 
|  |  | 
|  | let mut foo = Foo(1); | 
|  | // This test is slightly contrived in an attempt to generate a mismatched types | 
|  | // error for the self type below, without using the turbofish. | 
|  | foo.get6(Silly); | 
|  | //~^ ERROR type mismatch | 
|  | let mut foo = Foo(1); | 
|  | let foo = &foo; | 
|  | foo.get6(Silly); | 
|  | //~^ ERROR type mismatch | 
|  |  | 
|  | let t = std::rc::Rc::new(Bar(std::marker::PhantomData)); | 
|  | t.get(); | 
|  | //~^ ERROR its trait bounds were not satisfied | 
|  | let t = &t; | 
|  | // This is a further attempt at triggering 'type mismatch' errors | 
|  | // from arbitrary self types without resorting to the turbofish. | 
|  | // Ideally, here, t is Thing<Rc<Target=Self>> while we're going to call | 
|  | // it with a &t method receiver. However, this doesn't work since that | 
|  | // type of t becomes recursive and trait bounds can't be satisfied. | 
|  | t.get(); | 
|  | //~^ ERROR its trait bounds were not satisfied | 
|  | } |