diff options
| author | Yuki Okushi <yuki.okushi@huawei.com> | 2021-11-08 09:45:15 +0900 |
|---|---|---|
| committer | Yuki Okushi <yuki.okushi@huawei.com> | 2021-11-09 08:04:39 +0900 |
| commit | ebd401bc36ebc5530cc6cadbddd9c6e79e13d989 (patch) | |
| tree | b90c56f030402423329f394eb5b7997ca2f8f622 | |
| parent | 46b8e7488eae116722196e8390c1bd2ea2e396cf (diff) | |
| download | rust-ebd401bc36ebc5530cc6cadbddd9c6e79e13d989.tar.gz rust-ebd401bc36ebc5530cc6cadbddd9c6e79e13d989.zip | |
Add some GATs-related regression tests
4 files changed, 101 insertions, 0 deletions
diff --git a/src/test/ui/generic-associated-types/issue-88595.rs b/src/test/ui/generic-associated-types/issue-88595.rs new file mode 100644 index 00000000000..e397390783f --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-88595.rs @@ -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 +} diff --git a/src/test/ui/generic-associated-types/issue-88595.stderr b/src/test/ui/generic-associated-types/issue-88595.stderr new file mode 100644 index 00000000000..1948f82d0c9 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-88595.stderr @@ -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`. diff --git a/src/test/ui/generic-associated-types/issue-90014.rs b/src/test/ui/generic-associated-types/issue-90014.rs new file mode 100644 index 00000000000..f110b069383 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-90014.rs @@ -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() {} diff --git a/src/test/ui/generic-associated-types/issue-90014.stderr b/src/test/ui/generic-associated-types/issue-90014.stderr new file mode 100644 index 00000000000..125d817e351 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-90014.stderr @@ -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`. |
