diff options
| author | Yuki Okushi <jtitor@2k36.org> | 2021-11-09 22:02:23 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-09 22:02:23 +0900 |
| commit | c2f095a37bd566be1f3fdb5b586025c724f25684 (patch) | |
| tree | 8970cebc7925c576146a79893b4c16f03611c6b9 | |
| parent | 6e39d27a8200d65922b8eecb2d2bfbaab99f88fb (diff) | |
| parent | ebd401bc36ebc5530cc6cadbddd9c6e79e13d989 (diff) | |
| download | rust-c2f095a37bd566be1f3fdb5b586025c724f25684.tar.gz rust-c2f095a37bd566be1f3fdb5b586025c724f25684.zip | |
Rollup merge of #90678 - JohnTitor:add-some-gats-tests, r=jackh726
Add some GATs-related regression tests Closes #88595, closes #90014 r? `@jackh726`
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`. |
