// Regression test for #55756. // // In this test, the result of `self.callee` is a projection `>::Guard`. As it may contain a destructor, the dropck // rules require that this type outlivess the scope of `state`. Unfortunately, // our region inference is not smart enough to figure out how to // translate a requirement like // // >::guard: 'r // // into a requirement that `'0: 'r` -- in particular, it fails to do // so because it *also* knows that `>::Guard: 'a` // from the trait definition. Faced with so many choices, the current // solver opts to do nothing. // // Fixed by tweaking the solver to recognize that the constraint from // the environment duplicates one from the trait. // // check-pass #![crate_type="lib"] pub trait Database<'a> { type Guard: 'a; } pub struct Stateful<'a, D: 'a>(&'a D); impl<'b, D: for <'a> Database<'a>> Stateful<'b, D> { pub fn callee<'a>(&'a self) -> >::Guard { unimplemented!() } pub fn caller<'a>(&'a self) -> >::Guard { let state = self.callee(); unimplemented!() } }