Add async versions of arbitrary_self_types_pin_lifetime tests.
This commit is contained in:
parent
f3957876c8
commit
5ce8f7a1f9
7 changed files with 230 additions and 0 deletions
37
src/test/ui/self/arbitrary_self_types_pin_lifetime-async.rs
Normal file
37
src/test/ui/self/arbitrary_self_types_pin_lifetime-async.rs
Normal file
|
@ -0,0 +1,37 @@
|
|||
// check-pass
|
||||
// edition:2018
|
||||
|
||||
#![feature(async_await)]
|
||||
|
||||
use std::pin::Pin;
|
||||
use std::task::{Context, Poll};
|
||||
|
||||
struct Foo;
|
||||
|
||||
impl Foo {
|
||||
async fn pin_ref(self: Pin<&Self>) -> Pin<&Self> { self }
|
||||
|
||||
async fn pin_mut(self: Pin<&mut Self>) -> Pin<&mut Self> { self }
|
||||
|
||||
async fn pin_pin_pin_ref(self: Pin<Pin<Pin<&Self>>>) -> Pin<Pin<Pin<&Self>>> { self }
|
||||
|
||||
async fn pin_ref_impl_trait(self: Pin<&Self>) -> impl Clone + '_ { self }
|
||||
|
||||
fn b(self: Pin<&Foo>, f: &Foo) -> Pin<&Foo> { self }
|
||||
}
|
||||
|
||||
type Alias<T> = Pin<T>;
|
||||
impl Foo {
|
||||
async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> Alias<&Self> { self }
|
||||
}
|
||||
|
||||
// FIXME(Centril): extend with the rest of the non-`async fn` test
|
||||
// when we allow `async fn`s inside traits and trait implementations.
|
||||
|
||||
fn main() {
|
||||
let mut foo = Foo;
|
||||
{ Pin::new(&foo).pin_ref() };
|
||||
{ Pin::new(&mut foo).pin_mut() };
|
||||
{ Pin::new(Pin::new(Pin::new(&foo))).pin_pin_pin_ref() };
|
||||
{ Pin::new(&foo).pin_ref_impl_trait() };
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
error: lifetime may not live long enough
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_impl_trait-async.rs:10:48
|
||||
|
|
||||
LL | async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
| - ^^^^^^^^ returning this value requires that `'_` must outlive `'static`
|
||||
| |
|
||||
| lifetime `'_` defined here
|
||||
help: to allow this `impl Trait` to capture borrowed data with lifetime `'_`, add `'_` as a constraint
|
||||
|
|
||||
LL | async fn f(self: Pin<&Self>) -> impl Clone + '_ { self }
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
// edition:2018
|
||||
|
||||
#![feature(async_await)]
|
||||
|
||||
use std::pin::Pin;
|
||||
|
||||
struct Foo;
|
||||
|
||||
impl Foo {
|
||||
async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
}
|
||||
|
||||
fn main() {
|
||||
{ Pin::new(&Foo).f() };
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
error: cannot infer an appropriate lifetime
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_impl_trait-async.rs:10:16
|
||||
|
|
||||
LL | async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
| ^^^^ ---------- this return type evaluates to the `'static` lifetime...
|
||||
| |
|
||||
| ...but this borrow...
|
||||
|
|
||||
note: ...can't outlive the lifetime '_ as defined on the method body at 10:26
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_impl_trait-async.rs:10:26
|
||||
|
|
||||
LL | async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
| ^
|
||||
help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime '_ as defined on the method body at 10:26
|
||||
|
|
||||
LL | async fn f(self: Pin<&Self>) -> impl Clone + '_ { self }
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:10:45
|
||||
|
|
||||
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
||||
| ^
|
||||
|
|
||||
= note: return-position elided lifetimes require exactly one input-position elided lifetime, found multiple.
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:60
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^
|
||||
|
|
||||
= note: return-position elided lifetimes require exactly one input-position elided lifetime, found multiple.
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:67
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^
|
||||
|
|
||||
= note: return-position elided lifetimes require exactly one input-position elided lifetime, found multiple.
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
|
@ -0,0 +1,28 @@
|
|||
// edition:2018
|
||||
|
||||
#![feature(async_await)]
|
||||
|
||||
use std::pin::Pin;
|
||||
|
||||
struct Foo;
|
||||
|
||||
impl Foo {
|
||||
async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
||||
//~^ ERROR missing lifetime specifier
|
||||
//~| ERROR cannot infer an appropriate lifetime
|
||||
// FIXME: should be E0623?
|
||||
|
||||
async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
//~^ ERROR missing lifetime specifier
|
||||
//~| ERROR cannot infer an appropriate lifetime
|
||||
//~| ERROR missing lifetime specifier
|
||||
//~| ERROR cannot infer an appropriate lifetime
|
||||
// FIXME: should be E0623?
|
||||
}
|
||||
|
||||
type Alias<T> = Pin<T>;
|
||||
impl Foo {
|
||||
async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg } //~ ERROR E0623
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,88 @@
|
|||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:10:45
|
||||
|
|
||||
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
||||
| ^
|
||||
|
|
||||
= note: return-position elided lifetimes require exactly one input-position elided lifetime, found multiple.
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:60
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^
|
||||
|
|
||||
= note: return-position elided lifetimes require exactly one input-position elided lifetime, found multiple.
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:67
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^
|
||||
|
|
||||
= note: return-position elided lifetimes require exactly one input-position elided lifetime, found multiple.
|
||||
|
||||
error: cannot infer an appropriate lifetime
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:10:33
|
||||
|
|
||||
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
||||
| ^ ---- this return type evaluates to the `'static` lifetime...
|
||||
| |
|
||||
| ...but this borrow...
|
||||
|
|
||||
note: ...can't outlive the lifetime '_ as defined on the method body at 10:26
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:10:26
|
||||
|
|
||||
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
||||
| ^
|
||||
help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime '_ as defined on the method body at 10:26
|
||||
|
|
||||
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo + '_ { f }
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: cannot infer an appropriate lifetime
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:16
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^^^^ ...but this borrow... ----------------- this return type evaluates to the `'static` lifetime...
|
||||
|
|
||||
note: ...can't outlive the lifetime '_ as defined on the method body at 15:26
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:26
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^
|
||||
help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime '_ as defined on the method body at 15:26
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) + '_ { (self, f) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: cannot infer an appropriate lifetime
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:34
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^ ----------------- this return type evaluates to the `'static` lifetime...
|
||||
| |
|
||||
| ...but this borrow...
|
||||
|
|
||||
note: ...can't outlive the lifetime '_ as defined on the method body at 15:26
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:26
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||
| ^
|
||||
help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime '_ as defined on the method body at 15:26
|
||||
|
|
||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) + '_ { (self, f) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0623]: lifetime mismatch
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:25:58
|
||||
|
|
||||
LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg }
|
||||
| ----- ^^^
|
||||
| | |
|
||||
| | ...but data from `arg` is returned here
|
||||
| this parameter and the return type are declared with different lifetimes...
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
Loading…
Add table
Add a link
Reference in a new issue