Avoid unsound GADT constraints derived from subtyping relations between singletons and refined types #14728
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 PR freezes GADT constraints when comparing the type member bounds of singleton types and refined types, since the GADT constraints derived from the comparison can be overly-strong (unsound).
The following code snippet is unsound, but accepted by the compiler.
In the above code snippet, we will try to extract GADT constraint from the subtyping relation
foo.type <:< Foo {type A <: X}
. When comparing these two types, the type comparer will try to compare the bounds of the type memberThis
:isSubType [ >: Nothing <: Any ] <: [ >: Nothing <: X ]
, which will give us the constraintAny <: X
. However, deriving GADT constraints from this comparison can be unsound, since, by comparing the type member bounds offoo.type
andFoo {type A <: X}
, what we do is essentially upcasting the singleton typefoo.type
toFoo
and compareFoo#This
to(Foo {type A <: X})#This
. We can not extract GADT constraints from this since the LHS is upcasted.Therefore, we may have to freeze GADT constraints under such conditions to avoid deriving unsound constraints.