35 lines
1.3 KiB
Rust
35 lines
1.3 KiB
Rust
//@ revisions: current next
|
|
//@[next] compile-flags: -Znext-solver
|
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
|
//@ check-pass
|
|
|
|
// We've got `'0 member ['a, 'b, 'static]` and `'1 member ['a, 'b, 'static]`.
|
|
//
|
|
// As '0 gets outlived by 'a - its "upper bound" - the only applicable choice
|
|
// region is 'a.
|
|
//
|
|
// '1 has to outlive 'b so the only applicable choice regions are 'b and 'static.
|
|
// Considering this member constraint by itself would choose 'b as it is the
|
|
// smaller of the two regions.
|
|
//
|
|
// However, this is only the case when ignoring the member constraint on '0.
|
|
// After applying this constraint and requiring '0 to outlive 'a. As '1 outlives
|
|
// '0, the region 'b is no longer an applicable choice region for '1 as 'b does
|
|
// does not outlive 'a. We would therefore choose 'static.
|
|
//
|
|
// This means applying member constraints is order dependent. We handle this by
|
|
// first applying member constraints for regions 'x and then consider the resulting
|
|
// constraints when applying member constraints for regions 'y with 'y: 'x.
|
|
fn with_constraints<'r0, 'r1, 'a, 'b>() -> *mut (&'r0 (), &'r1 ())
|
|
where
|
|
'r1: 'r0,
|
|
'a: 'r0,
|
|
'r1: 'b,
|
|
{
|
|
loop {}
|
|
}
|
|
fn foo<'a, 'b>() -> impl Sized + use<'a, 'b> {
|
|
with_constraints::<'_, '_, 'a, 'b>()
|
|
}
|
|
fn main() {}
|