rust/tests/ui/self/arbitrary-self-from-method-...

65 lines
1.7 KiB
Rust

#![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
}