Rustc should be able to unify <T as A<'static>>::B>
with <T as A<'a>>::B>
for all 'a
, given A::B: 'static
#50166
Description
I had to use this trick to work around the lack of working GATs:
Ended up with this code: https://play.rust-lang.org/?gist=5f14fd0600bf0b1e1e9eac2c8a3d194a&version=stable
It works but to be able to do
pub struct AppMgr<T: for<'a> DeviceApp<'a>> {
device: Option<T::Dev>,
app: T,
// ...
}
I had to split up my trait
pub trait DeviceApp<'a> {
type Dev: Device;
// ...
into two
pub trait DeviceSpecific {
type Dev: Device;
}
pub trait DeviceApp<'a>: DeviceSpecific {
// ...
to pull Dev
out of the quantification scope of 'a
.
I thought it should work if I put Dev
back inside DeviceApp
but make it : 'static
so that rustc
can infer that it's the same for all 'a
:
/*
pub trait DeviceSpecific {
type Dev: Device;
}
pub trait DeviceApp<'a>: DeviceSpecific {
*/
pub trait DeviceApp<'a> {
type Dev: Device + 'static;
// ...
pub struct AppMgr<T: for<'a> DeviceApp<'a>> {
// device: Option<T::Dev>,
device: Option<<T as DeviceApp<'static>>::Dev>, // because Dev: 'static, i thought it will be unifyable with any 'a
app: T,
// ...
}
But it doesn't work. Now I get this error:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter 'a in function call due to conflicting requirements
--> src/main.rs:79:53
|
79 | device.frame(now, |device, input| { app.process(device, input, v) })
| ^^^^^^^
|
note: first, the lifetime cannot outlive the lifetime 'a as defined on the method body at 75:5...
--> src/main.rs:75:5
|
75 | pub fn process<'a>(&mut self, now: u64, msgs: Vec<<T as DeviceApp<'a>>::Msg>, v: &'a mut <T as DeviceApp<'a>>::BorrowedState) -> Vec<<T as DeviceApp<'a>>::Event> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: ...so that the expression is assignable:
expected &mut <T as DeviceApp<'_>>::BorrowedState
found &mut <T as DeviceApp<'a>>::BorrowedState
= note: but, the lifetime must be valid for the static lifetime...
= note: ...so that the expression is assignable:
expected &mut <T as DeviceApp<'_>>::Dev
found &mut <T as DeviceApp<'static>>::Dev
https://play.rust-lang.org/?gist=d4084c0a87890d4ed17d0491e453565b&version=stable
Why can't rustc
unify <T as DeviceApp<'static>>::Dev>
with <T as DeviceApp<'a>>::Dev>
for all 'a
, when it KNOWS that Dev: 'static
(the type doesn't depend on 'a
, so it can only be the same for all 'a
)?
It should be able to infer it..
Activity