Closed
Description
The following snippet, extracted from the crate shred v0.7.0, fails to compile with NLL, but only when compiled with --crate-type lib
:
// NB You must compile with `--crate-type lib` to see the failure!
#![feature(nll)]
pub trait Accessor: Sized {
}
pub enum AccessorCow<'a, 'b, T>
where
AccessorTy<'a, T>: 'b,
T: System<'a> + ?Sized,
'a: 'b,
{
/// A reference to an accessor.
Ref(&'b AccessorTy<'a, T>),
/// An owned accessor.
Owned(AccessorTy<'a, T>),
}
type AccessorTy<'a, T> = <<T as System<'a>>::SystemData as DynamicSystemData<'a>>::Accessor;
pub trait System<'a> {
type SystemData: DynamicSystemData<'a>;
}
pub trait SystemData<'a> {
}
pub trait DynamicSystemData<'a> {
/// The accessor of the `SystemData`, which specifies the read and write dependencies and does
/// the fetching.
type Accessor: Accessor;
}
fn main() { }
yields
> rustc +nightly ~/tmp/reduce.rs -Zborrowck=mir -Ztwo-phase-borrows --crate-type lib
error[E0309]: the parameter type `T` may not live long enough
--> /home/nmatsakis/tmp/reduce.rs:13:5
|
13 | Ref(&'b AccessorTy<'a, T>),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `T: 'b`...
error[E0309]: the parameter type `T` may not live long enough
--> /home/nmatsakis/tmp/reduce.rs:15:5
|
15 | Owned(AccessorTy<'a, T>),
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `T: 'b`...
I'm not entirely sure what is going on here, but it seems very fishy, particularly since it is specific to --crate-type lib
.