From f9344296c15308ed37c0fcc584f4174b332648cf Mon Sep 17 00:00:00 2001 From: Bram van den Heuvel Date: Tue, 26 Oct 2021 12:48:22 +0200 Subject: [PATCH] Add regression test for #87258 --- .../generic-associated-types/issue-87258_a.rs | 24 +++++++++++++++++ .../issue-87258_a.stderr | 11 ++++++++ .../generic-associated-types/issue-87258_b.rs | 26 +++++++++++++++++++ .../issue-87258_b.stderr | 11 ++++++++ 4 files changed, 72 insertions(+) create mode 100644 src/test/ui/generic-associated-types/issue-87258_a.rs create mode 100644 src/test/ui/generic-associated-types/issue-87258_a.stderr create mode 100644 src/test/ui/generic-associated-types/issue-87258_b.rs create mode 100644 src/test/ui/generic-associated-types/issue-87258_b.stderr diff --git a/src/test/ui/generic-associated-types/issue-87258_a.rs b/src/test/ui/generic-associated-types/issue-87258_a.rs new file mode 100644 index 00000000000..d9d17751fa6 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-87258_a.rs @@ -0,0 +1,24 @@ +#![feature(type_alias_impl_trait)] +#![feature(generic_associated_types)] + +// See https://github.com/rust-lang/rust/issues/87258#issuecomment-883293367 + +trait Trait1 {} + +struct Struct<'b>(&'b ()); + +impl<'d> Trait1 for Struct<'d> {} + +pub trait Trait2 { + type FooFuture<'a>: Trait1; + fn foo<'a>() -> Self::FooFuture<'a>; +} + +impl<'c, S: Trait2> Trait2 for &'c mut S { + type FooFuture<'a> = impl Trait1; + fn foo<'a>() -> Self::FooFuture<'a> { //~ ERROR + Struct(unimplemented!()) + } +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-87258_a.stderr b/src/test/ui/generic-associated-types/issue-87258_a.stderr new file mode 100644 index 00000000000..93513a4563f --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-87258_a.stderr @@ -0,0 +1,11 @@ +error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds + --> $DIR/issue-87258_a.rs:19:21 + | +LL | fn foo<'a>() -> Self::FooFuture<'a> { + | ^^^^^^^^^^^^^^^^^^^ + | + = note: hidden type `Struct<'_>` captures lifetime '_#7r + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0700`. diff --git a/src/test/ui/generic-associated-types/issue-87258_b.rs b/src/test/ui/generic-associated-types/issue-87258_b.rs new file mode 100644 index 00000000000..b29a978f517 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-87258_b.rs @@ -0,0 +1,26 @@ +#![feature(type_alias_impl_trait)] +#![feature(generic_associated_types)] + +// See https://github.com/rust-lang/rust/issues/87258#issuecomment-883293367 + +trait Trait1 {} + +struct Struct<'b>(&'b ()); + +impl<'d> Trait1 for Struct<'d> {} + +pub trait Trait2 { + type FooFuture<'a>: Trait1; + fn foo<'a>() -> Self::FooFuture<'a>; +} + +type Helper<'xenon, 'yttrium, KABOOM: Trait2> = impl Trait1; + +impl<'c, S: Trait2> Trait2 for &'c mut S { + type FooFuture<'a> = Helper<'c, 'a, S>; + fn foo<'a>() -> Self::FooFuture<'a> { //~ ERROR + Struct(unimplemented!()) + } +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-87258_b.stderr b/src/test/ui/generic-associated-types/issue-87258_b.stderr new file mode 100644 index 00000000000..e077a423400 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-87258_b.stderr @@ -0,0 +1,11 @@ +error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds + --> $DIR/issue-87258_b.rs:21:21 + | +LL | fn foo<'a>() -> Self::FooFuture<'a> { + | ^^^^^^^^^^^^^^^^^^^ + | + = note: hidden type `Struct<'_>` captures lifetime '_#7r + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0700`.