Add test for multiple ref-self

This commit is contained in:
Taiki Endo 2019-07-16 01:09:25 +09:00
parent aab9edc68a
commit 8507b8e42f
3 changed files with 73 additions and 7 deletions

View file

@ -0,0 +1,43 @@
// check-pass
#![feature(arbitrary_self_types)]
#![allow(non_snake_case)]
use std::marker::PhantomData;
use std::ops::Deref;
use std::pin::Pin;
struct Struct { }
struct Wrap<T, P>(T, PhantomData<P>);
impl<T, P> Deref for Wrap<T, P> {
type Target = T;
fn deref(&self) -> &T { &self.0 }
}
impl Struct {
// Test using multiple `&Self`:
fn wrap_ref_Self_ref_Self(self: Wrap<&Self, &Self>, f: &u8) -> &u8 {
f
}
fn box_wrap_ref_Self_ref_Self(self: Box<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
f
}
fn pin_wrap_ref_Self_ref_Self(self: Pin<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
f
}
fn box_box_wrap_ref_Self_ref_Self(self: Box<Box<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
f
}
fn box_pin_wrap_ref_Self_ref_Self(self: Box<Pin<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
f
}
}
fn main() { }

View file

@ -1,10 +1,19 @@
#![feature(arbitrary_self_types)]
#![allow(non_snake_case)]
use std::marker::PhantomData;
use std::ops::Deref;
use std::pin::Pin;
struct Struct { }
struct Wrap<T, P>(T, PhantomData<P>);
impl<T, P> Deref for Wrap<T, P> {
type Target = T;
fn deref(&self) -> &T { &self.0 }
}
impl Struct {
// Test using `&self` sugar:
@ -33,6 +42,10 @@ impl Struct {
fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
f //~ ERROR lifetime mismatch
}
fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 {
f //~ ERROR lifetime mismatch
}
}
fn main() { }

View file

@ -1,5 +1,5 @@
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:14:9
--> $DIR/ref-self.rs:21:9
|
LL | fn ref_self(&self, f: &u32) -> &u32 {
| ---- ----
@ -9,7 +9,7 @@ LL | f
| ^ ...but data from `f` is returned here
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:20:9
--> $DIR/ref-self.rs:27:9
|
LL | fn ref_Self(self: &Self, f: &u32) -> &u32 {
| ---- ----
@ -19,7 +19,7 @@ LL | f
| ^ ...but data from `f` is returned here
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:24:9
--> $DIR/ref-self.rs:31:9
|
LL | fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
| ---- ----
@ -29,7 +29,7 @@ LL | f
| ^ ...but data from `f` is returned here
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:28:9
--> $DIR/ref-self.rs:35:9
|
LL | fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
| ---- ----
@ -39,7 +39,7 @@ LL | f
| ^ ...but data from `f` is returned here
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:32:9
--> $DIR/ref-self.rs:39:9
|
LL | fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
| ---- ----
@ -49,7 +49,7 @@ LL | f
| ^ ...but data from `f` is returned here
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:36:9
--> $DIR/ref-self.rs:43:9
|
LL | fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
| ---- ----
@ -58,5 +58,15 @@ LL | fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
LL | f
| ^ ...but data from `f` is returned here
error: aborting due to 6 previous errors
error[E0623]: lifetime mismatch
--> $DIR/ref-self.rs:47:9
|
LL | fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 {
| --- ---
| |
| this parameter and the return type are declared with different lifetimes...
LL | f
| ^ ...but data from `f` is returned here
error: aborting due to 7 previous errors