rust/tests/ui/implied-bounds/assoc-ty-wf-used-to-get-assoc-ty.rs

28 lines
973 B
Rust
Raw Normal View History

// Test for a less than ideal interaction of implied bounds and normalization.
trait Tr {
type Ty;
}
impl<T: 'static> Tr for T {
type Ty = &'static T;
}
// `<&'a u8 as Tr>::Ty` should cause an error because `&'a u8: Tr` doesn't hold for
// all possible 'a. However, we consider normalized types for implied bounds.
//
// We normalize this projection to `&'static &'a u8` and add a nested `&'a u8: 'static`
// bound. This bound is then proven using the implied bounds for `&'static &'a u8` which
// we only get by normalizing in the first place.
fn test<'a>(x: &'a u8, _wf: <&'a u8 as Tr>::Ty) -> &'static u8 { x }
fn main() {
// This works as we have 'static references due to promotion.
let _: &'static u8 = test(&3, &&3);
// This causes an error because the projection requires 'a to be 'static.
// It would be unsound if this compiled.
let x: u8 = 3;
let _: &'static u8 = test(&x, &&3);
//~^ ERROR `x` does not live long enough
}