-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Sharpen range approximation for applied types with capture set ranges (…
…#16261) This is a stopgap to avoid approximating the core type to Nothing. It can probably be dropped once we have capture set ranges that we can keep as inference results. The problem is, what should be the approximation of the range C[{cs1} A .. {cs2} A] where the type constructor `C` is non-variant? If the variance of the enclosing map is positive, this is `C[? >: {cs1} A <: {cs2} A]`, which is a supertype of both range end points `C[{cs1} A]` and `C[{cs2} A]`. But if the variance is negative, we would normally fall back to `Nothing`, since that is the only known subtype of both range end points. This reasoning seems too strict for capture checking. In a sense, we have already inferred `C[A]` before; now we just need to find out what the set should be. What we are after is a notion of a _capture set range_. I.e. something like C[{cs1}..{cs2} A] with the meaning that the capture set of `C` is an unknown set between `cs1` and `cs2`. We don't have that abstraction yet, so for now we approximate by the bounds, which avoids the failures, even though its soundness status is currently a bit unclear.
- Loading branch information
Showing
5 changed files
with
45 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
@annotation.capability class Cap | ||
|
||
class LazyRef[T](val elem: () => T): | ||
val get: {elem} () -> T = elem | ||
def map[U](f: T => U): {f, this} LazyRef[U] = | ||
new LazyRef(() => f(elem())) | ||
|
||
def map[A, B](ref: {*} LazyRef[A], f: A => B): {f, ref} LazyRef[B] = | ||
new LazyRef(() => f(ref.elem())) | ||
|
||
def main(io: Cap) = { | ||
def mapd[A, B]: ({io} LazyRef[A], A => B) => {*} LazyRef[B] = | ||
(ref1, f1) => map[A, B](ref1, f1) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
class Name | ||
class TermName extends Name | ||
class TypeName extends Name | ||
|
||
trait ParamInfo: | ||
type ThisName <: Name | ||
def variance: Long | ||
object ParamInfo: | ||
type Of[N <: Name] = ParamInfo { type ThisName = N } | ||
|
||
def test(tparams1: List[ParamInfo{ type ThisName = TypeName }], tparams2: List[ParamInfo.Of[TypeName]]) = | ||
tparams1.lazyZip(tparams2).map((p1, p2) => p1.variance + p2.variance) | ||
|