Correctly synthesize manifest[T]
when T
is an alias
#6380
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This
crashed the compiler. Comparing the AST generated for
manifest[T]
withthe working version
manifest[A[_]]
shows that a cast is inserted tothe
classOf
argument in the latter case, but not the former.For
manifest[T]
:For
manifest[A[_]]
My approach for fixing this was simply to see what makes the compiler
insert the cast. The condition is here:
tp
isA.T
, the type alias. In the first call tomot
,tp0
isA.T
.tp1 = tp0.dealias
is anExistentialType
, somot
calledrecursively with
tp0 = tp1.skolemizeExistential
.A cast seems to be needed if the original type
tp
is an existential(not sure why that is), but we need to dealias. Not sure if we should
cast to
tp
ortp.dealias
, I guess it doesn't matter.Fixes scala/bug#9155