2018-08-28 04:46:08 +00:00
|
|
|
// Various examples of structs whose fields are not well-formed.
|
|
|
|
|
|
|
|
#![allow(dead_code)]
|
|
|
|
|
|
|
|
trait Dummy<'a> {
|
2020-07-24 20:59:43 +00:00
|
|
|
type Out;
|
2018-08-28 04:46:08 +00:00
|
|
|
}
|
|
|
|
impl<'a, T> Dummy<'a> for T
|
2020-07-24 20:59:43 +00:00
|
|
|
where
|
|
|
|
T: 'a,
|
2018-08-28 04:46:08 +00:00
|
|
|
{
|
2020-07-24 20:59:43 +00:00
|
|
|
type Out = ();
|
2018-08-28 04:46:08 +00:00
|
|
|
}
|
|
|
|
type RequireOutlives<'a, T> = <T as Dummy<'a>>::Out;
|
|
|
|
|
|
|
|
enum Ref1<'a, T> {
|
2020-07-24 20:59:43 +00:00
|
|
|
Ref1Variant1(RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough
|
2018-08-28 04:46:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
enum Ref2<'a, T> {
|
|
|
|
Ref2Variant1,
|
|
|
|
Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough
|
|
|
|
}
|
|
|
|
|
2020-07-24 20:59:43 +00:00
|
|
|
enum RefOk<'a, T: 'a> {
|
|
|
|
RefOkVariant1(&'a T),
|
2018-08-28 04:46:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// This is now well formed. RFC 2093
|
|
|
|
enum RefIndirect<'a, T> {
|
2020-07-24 20:59:43 +00:00
|
|
|
RefIndirectVariant1(isize, RefOk<'a, T>),
|
2018-08-28 04:46:08 +00:00
|
|
|
}
|
|
|
|
|
2020-07-24 20:59:43 +00:00
|
|
|
enum RefDouble<'a, 'b, T> {
|
|
|
|
RefDoubleVariant1(&'a RequireOutlives<'b, T>),
|
|
|
|
//~^ the parameter type `T` may not live long enough [E0309]
|
2018-08-28 04:46:08 +00:00
|
|
|
}
|
|
|
|
|
2020-07-24 20:59:43 +00:00
|
|
|
fn main() {}
|