-
Notifications
You must be signed in to change notification settings - Fork 182
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement GATs #116
Comments
This was referenced May 7, 2018
Merged
Merged
tmandry
added a commit
that referenced
this issue
May 9, 2018
Refactors LowerWhereClause to permit multiple domain goals from a single AST where clause. For implementing GATs (#116).
Follow-up (should be straightforward): support quantified bounds on GATs, both in the grammar and in the rules, e.g. trait Foo {
type Item<V>: forall<'a> Fn(&'a V);
} |
(Reopening because of the follow-up) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Step 1
The grammar needs to be extended to support bounds and (quantified) where clauses on associated types like in:
The grammar is located parser.lalrpop, and the AST in ast.rs.
When this is done, this item:
https://github.com/rust-lang-nursery/chalk/blob/eeb21829c1e847921261ad820b5b2ec35b649c76/chalk-parse/src/parser.lalrpop#L204-L207
won't be needed anymore because we will be using
QuantifiedWhereClauses
everywhere.We would also remove where clauses on associated type values because they are useless:
https://github.com/rust-lang-nursery/chalk/blob/eeb21829c1e847921261ad820b5b2ec35b649c76/chalk-parse/src/parser.lalrpop#L104-L111
Step 2
Currently, a where clause of the form
where T: Foo<Item = U>
translated to a single domain goalProjectionEq(<T as Foo>::Item = U)
. We would need this clause to be translated to two distinct domain goals:ProjectionEq(<T as Foo>::Item = U)
as beforeImplemented(T: Foo)
Currently, we cannot translate one AST where clause to multiple IR domain goals. This means that the following trait:
https://github.com/rust-lang-nursery/chalk/blob/eeb21829c1e847921261ad820b5b2ec35b649c76/src/lower/mod.rs#L437-L439
should be changed into something like:
Step 3
Now we should be in a position where we can implement the various rules written in this comment (niko's comment just below can be ignored, it was basically merged into the main one). This includes:
Note: the organization of these two files will change after #114 is fixed, so the preceding text may become obsolete.
Step 4
At that point, the domain goal
WellFormed(ProjectionEq)
will be unused. See #115 for the next steps.cc @rust-lang-nursery/wg-traits
The text was updated successfully, but these errors were encountered: