member constraints are order-dependent
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.1k
- PR merge metrics
- PR metrics pending
Description
struct Inv<'a>(*mut &'a ());
fn mk<'m>() -> (Inv<'m>, Inv<'m>) {
loop {}
}
fn ok<'a, 'b: 'a>() -> (impl Sized + use<'a>, impl Sized + use<'b>) {
mk()
}
fn err<'a, 'b: 'a>() -> (impl Sized + use<'b>, impl Sized + use<'a>) {
mk()
}
this fails with
error[E0700]: hidden type for `impl Sized` captures lifetime that does not appear in bounds
--> src/lib.rs:9:5
|
8 | fn err<'a, 'b: 'a>() -> (impl Sized + use<'b>, impl Sized + use<'a>) {
| -- -------------------- opaque type defined here
| |
| hidden type `Inv<'b>` captures the lifetime `'b` as defined here
9 | mk()
| ^^^^
|
help: add `'b` to the `use<...>` bound to explicitly capture it
|
8 | fn err<'a, 'b: 'a>() -> (impl Sized + use<'b>, impl Sized + use<'a, 'b>) {
| ++++
We've got 'm member ['a, 'static] and 'm member ['b, 'static]. The final region chosen for 'm depends on the order in which we apply these constraints:
'm member ['b, 'static]chooses'b'm member ['a, 'static]as'a: 'bdoes not hold, this has to choose'static- we end up with
'm = 'staticwhich satisfies both member constraints
and alternatively:
'm member ['a, 'static]chooses'a'm member ['b, 'static]can still choose'bas'b: 'aholds- we end up with
'm = 'bwhich means that'm member ['a, 'static]does not hold
Fixing this is not too difficult, we can "simply" apply member constraints for each member region until we reach a fixpoint. we can implement this separately once https://github.com/rust-lang/rust/pull/139587 landed.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the provided Rust example and confirming that the result depends on the order of member constraints. Read the referenced PR 139587 before locating the member-constraint handling in the compiler. Done means applying constraints to a fixpoint so both orderings produce a consistent valid result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100