| #![feature(arbitrary_self_types)] |
| |
| use std::ops::{Receiver, Deref}; |
| |
| struct SmartPtr<'a, T: ?Sized>(&'a T); |
| |
| impl<'a, T: ?Sized> Deref for SmartPtr<'a, T> { |
| type Target = T; |
| fn deref(&self) -> &Self::Target { |
| self.0 |
| } |
| } |
| |
| impl<'a, T: ?Sized> Clone for SmartPtr<'a, T> { |
| fn clone(&self) -> Self { |
| Self(self.0) |
| } |
| } |
| |
| impl<'a, T: ?Sized> Copy for SmartPtr<'a, T> { |
| } |
| |
| struct Foo(u32); |
| impl Foo { |
| fn a<R: Receiver<Target=Self>>(self: R) -> u32 { |
| //~^ ERROR invalid generic `self` parameter type: `R` |
| 2 |
| } |
| fn b<R: Deref<Target=Self>>(self: R) -> u32 { |
| //~^ ERROR invalid generic `self` parameter type: `R` |
| self.0 |
| } |
| fn c(self: impl Receiver<Target=Self>) -> u32 { |
| //~^ ERROR invalid generic `self` parameter type: `impl Receiver<Target = Self>` |
| 3 |
| } |
| fn d(self: impl Deref<Target=Self>) -> u32 { |
| //~^ ERROR invalid generic `self` parameter type: `impl Deref<Target = Self>` |
| self.0 |
| } |
| } |
| |
| fn main() { |
| let foo = Foo(1); |
| assert_eq!((&foo).a::<&Foo>(), 2); |
| assert_eq!((&foo).b::<&Foo>(), 1); |
| assert_eq!((&foo).a(), 2); |
| assert_eq!((&foo).b(), 1); |
| assert_eq!((&foo).c(), 3); |
| assert_eq!((&foo).d(), 1); |
| assert_eq!(foo.a::<&Foo>(), 2); |
| //~^ ERROR mismatched types |
| assert_eq!(foo.b::<&Foo>(), 1); |
| //~^ ERROR mismatched types |
| let smart_ptr = SmartPtr(&foo); |
| assert_eq!(smart_ptr.a(), 2); |
| assert_eq!(smart_ptr.b(), 1); |
| assert_eq!(smart_ptr.c(), 3); |
| assert_eq!(smart_ptr.d(), 1); |
| assert_eq!(smart_ptr.a::<&Foo>(), 2); |
| //~^ ERROR mismatched types |
| assert_eq!(smart_ptr.b::<&Foo>(), 1); |
| //~^ ERROR mismatched types |
| } |