Add some GATs-related regression tests

This commit is contained in:
Yuki Okushi 2021-11-08 09:45:15 +09:00
parent 46b8e7488e
commit ebd401bc36
No known key found for this signature in database
GPG Key ID: DABA5B072961C18A
4 changed files with 101 additions and 0 deletions

View File

@ -0,0 +1,24 @@
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
fn main() {}
trait A<'a> {
type B<'b>: Clone
// FIXME(generic_associated_types): Remove one of the below bounds
// https://github.com/rust-lang/rust/pull/90678#discussion_r744976085
where
'a: 'b, Self: 'a, Self: 'b;
fn a(&'a self) -> Self::B<'a>;
}
struct C;
impl<'a> A<'a> for C {
type B<'b> = impl Clone;
//~^ ERROR: lifetime bound not satisfied
//~| ERROR: could not find defining uses
fn a(&'a self) -> Self::B<'a> {} //~ ERROR: non-defining opaque type use in defining scope
}

View File

@ -0,0 +1,40 @@
error[E0478]: lifetime bound not satisfied
--> $DIR/issue-88595.rs:19:5
|
LL | type B<'b> = impl Clone;
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
note: lifetime parameter instantiated with the lifetime `'a` as defined here
--> $DIR/issue-88595.rs:18:6
|
LL | impl<'a> A<'a> for C {
| ^^
note: but lifetime parameter must outlive the lifetime `'b` as defined here
--> $DIR/issue-88595.rs:19:12
|
LL | type B<'b> = impl Clone;
| ^^
error: non-defining opaque type use in defining scope
--> $DIR/issue-88595.rs:23:23
|
LL | fn a(&'a self) -> Self::B<'a> {}
| ^^^^^^^^^^^
|
note: lifetime used multiple times
--> $DIR/issue-88595.rs:18:6
|
LL | impl<'a> A<'a> for C {
| ^^
LL | type B<'b> = impl Clone;
| ^^
error: could not find defining uses
--> $DIR/issue-88595.rs:19:18
|
LL | type B<'b> = impl Clone;
| ^^^^^^^^^^
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0478`.

View File

@ -0,0 +1,22 @@
// edition:2018
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
use std::future::Future;
trait MakeFut {
type Fut<'a> where Self: 'a;
fn make_fut<'a>(&'a self) -> Self::Fut<'a>;
}
impl MakeFut for &'_ mut () {
type Fut<'a> = impl Future<Output = ()>;
//~^ ERROR: the type `&mut ()` does not fulfill the required lifetime
fn make_fut<'a>(&'a self) -> Self::Fut<'a> {
async { () }
}
}
fn main() {}

View File

@ -0,0 +1,15 @@
error[E0477]: the type `&mut ()` does not fulfill the required lifetime
--> $DIR/issue-90014.rs:14:5
|
LL | type Fut<'a> = impl Future<Output = ()>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: type must outlive the lifetime `'a` as defined here
--> $DIR/issue-90014.rs:14:14
|
LL | type Fut<'a> = impl Future<Output = ()>;
| ^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0477`.