forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add async versions of arbitrary_self_types_pin_lifetime tests.
- Loading branch information
Showing
7 changed files
with
230 additions
and
0 deletions.
There are no files selected for viewing
37 changes: 37 additions & 0 deletions
37
src/test/ui/self/arbitrary_self_types_pin_lifetime-async.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() }; | ||
} |
14 changes: 14 additions & 0 deletions
14
src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.nll.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
|
16 changes: 16 additions & 0 deletions
16
src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() }; | ||
} |
20 changes: 20 additions & 0 deletions
20
src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
|
27 changes: 27 additions & 0 deletions
27
src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.nll.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |
28 changes: 28 additions & 0 deletions
28
src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() {} |
88 changes: 88 additions & 0 deletions
88
src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |