38 lines
1.1 KiB
Rust
38 lines
1.1 KiB
Rust
|
// Regression test for #55756.
|
||
|
//
|
||
|
// In this test, the result of `self.callee` is a projection `<D as
|
||
|
// Database<'?0>>::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
|
||
|
//
|
||
|
// <D as Database<'0>>::guard: 'r
|
||
|
//
|
||
|
// into a requirement that `'0: 'r` -- in particular, it fails to do
|
||
|
// so because it *also* knows that `<D as Database<'a>>::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.
|
||
|
//
|
||
|
// compile-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) -> <D as Database<'a>>::Guard {
|
||
|
unimplemented!()
|
||
|
}
|
||
|
pub fn caller<'a>(&'a self) -> <D as Database<'a>>::Guard {
|
||
|
let state = self.callee();
|
||
|
unimplemented!()
|
||
|
}
|
||
|
}
|