837c1aff05
See the inline comments for the description of the new algorithm.
44 lines
973 B
Rust
44 lines
973 B
Rust
// ... continued from ./min-choice.rs
|
|
|
|
// check-fail
|
|
|
|
trait Cap<'a> {}
|
|
impl<T> Cap<'_> for T {}
|
|
|
|
fn type_test<'a, T: 'a>() -> &'a u8 { &0 }
|
|
|
|
// Make sure we don't pick `'b`.
|
|
fn test_b<'a, 'b, 'c, T>() -> impl Cap<'a> + Cap<'b> + Cap<'c>
|
|
where
|
|
'a: 'b,
|
|
'a: 'c,
|
|
T: 'b,
|
|
{
|
|
type_test::<'_, T>() // This should pass if we pick 'b.
|
|
//~^ ERROR the parameter type `T` may not live long enough
|
|
}
|
|
|
|
// Make sure we don't pick `'c`.
|
|
fn test_c<'a, 'b, 'c, T>() -> impl Cap<'a> + Cap<'b> + Cap<'c>
|
|
where
|
|
'a: 'b,
|
|
'a: 'c,
|
|
T: 'c,
|
|
{
|
|
type_test::<'_, T>() // This should pass if we pick 'c.
|
|
//~^ ERROR the parameter type `T` may not live long enough
|
|
}
|
|
|
|
// We need to pick min_choice from `['b, 'c]`, but it's ambiguous which one to pick because
|
|
// they're incomparable.
|
|
fn test_ambiguous<'a, 'b, 'c>(s: &'a u8) -> impl Cap<'b> + Cap<'c>
|
|
where
|
|
'a: 'b,
|
|
'a: 'c,
|
|
{
|
|
s
|
|
//~^ ERROR captures lifetime that does not appear in bounds
|
|
}
|
|
|
|
fn main() {}
|