diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:13 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:13 +0000 |
commit | 218caa410aa38c29984be31a5229b9fa717560ee (patch) | |
tree | c54bd55eeb6e4c508940a30e94c0032fbd45d677 /tests/ui/generic-associated-types/issue-93341.rs | |
parent | Releasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff) | |
download | rustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/generic-associated-types/issue-93341.rs')
-rw-r--r-- | tests/ui/generic-associated-types/issue-93341.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/ui/generic-associated-types/issue-93341.rs b/tests/ui/generic-associated-types/issue-93341.rs new file mode 100644 index 000000000..737b2bbdb --- /dev/null +++ b/tests/ui/generic-associated-types/issue-93341.rs @@ -0,0 +1,54 @@ +// check-pass + +use std::marker::PhantomData; + +pub struct Id<'id>(PhantomData<fn(&'id ()) -> &'id ()>); + +fn new_id() -> Id<'static> { + Id(PhantomData) +} + +pub trait HasLifetime where { + type AtLifetime<'a>; +} + +pub struct ExistentialLifetime<S: HasLifetime>(S::AtLifetime<'static>); + +impl<S: HasLifetime> ExistentialLifetime<S> { + pub fn new<F>(f: F) -> ExistentialLifetime<S> + where for<'id> F: FnOnce(Id<'id>) -> S::AtLifetime<'id> { + ExistentialLifetime(f(new_id())) + } +} + + +struct ExampleS<'id>(Id<'id>); + +struct ExampleMarker; + +impl HasLifetime for ExampleMarker { + type AtLifetime<'id> = ExampleS<'id>; +} + + +fn broken0() -> ExistentialLifetime<ExampleMarker> { + fn new_helper<'id>(id: Id<'id>) -> ExampleS<'id> { + ExampleS(id) + } + + ExistentialLifetime::<ExampleMarker>::new(new_helper) +} + +fn broken1() -> ExistentialLifetime<ExampleMarker> { + fn new_helper<'id>(id: Id<'id>) -> <ExampleMarker as HasLifetime>::AtLifetime<'id> { + ExampleS(id) + } + + ExistentialLifetime::<ExampleMarker>::new(new_helper) +} + +fn broken2() -> ExistentialLifetime<ExampleMarker> { + ExistentialLifetime::<ExampleMarker>::new(|id| ExampleS(id)) +} + +fn main() {} |