mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-30 14:01:51 +00:00
a2298a6f19
Account for `for` lifetimes when constructing closure to see if dereferencing the return value would be valid. Fix #125634, fix #124563.
48 lines
906 B
Rust
48 lines
906 B
Rust
// #124563
|
|
use std::marker::PhantomData;
|
|
|
|
pub trait Trait {}
|
|
|
|
pub trait Foo {
|
|
type Trait: Trait;
|
|
type Bar: Bar;
|
|
fn foo(&mut self);
|
|
}
|
|
|
|
pub struct FooImpl<'a, 'b, A: Trait>(PhantomData<&'a &'b A>);
|
|
|
|
impl<'a, 'b, T> Foo for FooImpl<'a, 'b, T>
|
|
where
|
|
T: Trait,
|
|
{
|
|
type Trait = T;
|
|
type Bar = BarImpl<'a, 'b, T>; //~ ERROR lifetime bound not satisfied
|
|
|
|
fn foo(&mut self) {
|
|
self.enter_scope(|ctx| { //~ ERROR lifetime may not live long enough
|
|
BarImpl(ctx); //~ ERROR lifetime may not live long enough
|
|
});
|
|
}
|
|
}
|
|
|
|
impl<'a, 'b, T> FooImpl<'a, 'b, T>
|
|
where
|
|
T: Trait,
|
|
{
|
|
fn enter_scope(&mut self, _scope: impl FnOnce(&mut Self)) {}
|
|
}
|
|
pub trait Bar {
|
|
type Foo: Foo;
|
|
}
|
|
|
|
pub struct BarImpl<'a, 'b, T: Trait>(&'b mut FooImpl<'a, 'b, T>);
|
|
|
|
impl<'a, 'b, T> Bar for BarImpl<'a, 'b, T>
|
|
where
|
|
T: Trait,
|
|
{
|
|
type Foo = FooImpl<'a, 'b, T>;
|
|
}
|
|
|
|
fn main() {}
|