Open nikomatsakis opened 7 years ago
just a heads up - https://github.com/rust-lang/rust/issues/42171 isn't closed yet (only half of it), though I'm planning on getting to the other half this week.
@tschottdorf ah yeah, I was thinking of the "check" as "in progress", but ... seems fine
Existential types carry where-clauses
Could they be moved to the binder? dyn Foo
-> dyn<X: Foo> X
would result in Ty::Dyn
having all the information in the binder and then substs would have just an anonymous type variable (bound at the aforementioned binder) or be empty for now.
@nikomatsakis @eddyb not sure whether this issue should be closed or not. How about those Unknown
s? (If needed, I have a lot of brandwidth to volunteer).
This isn't done, the checkboxes were only for prerequisites, I think.
Currently, the
Ty<'tcx>
type is a reference to a struct (&TyS
) that packages up a big ol' enumTypeVariants
. As part of chalkification, we would like to be able to write more efficient "decision tree" like procedures that branch on this type. This would be made nicer by factoring out the type into two parts, a "core" and a "substs". This core would be roughly equivalent to the existingTypeVariants
, but without the recursive references to other types, which would be uniformly packaged up in thesubsts
.Thus I imagine that the
TyS
struct would change to something like this:(Incidentally, this new notion of
TypeVariants
could maybe subsume the existingSimplifiedType
, though that's not super important.)Steps
This transition is best made in steps:
TyTuple
to use a substsClosureSubsts
type used inTyClosure
and make it into a normal substsGeneratorSubsts
]Unknowns
It's not 100% clear that this is a good plan, though the individual refactorings above all seem like good steps regardless. Some complicating factors:
TyFnPtr
embodies aPolyFnSig
, which carries a binder.cc @eddyb, who first suggested this to me cc @tschottdorf, who implemented #42297, a step along this path (and an important step for ATC regardless)