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; + //~^ 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; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: type must outlive the lifetime `'a` as defined here + --> $DIR/issue-90014.rs:14:14 + | +LL | type Fut<'a> = impl Future; + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0477`.