You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fixes#22103
Subtype problems where at least one side is a type variable representing
a capture variable are canonicalized to capturing type comparisons on
the special `CapSet` for the universe capture sets. For example, `C <:
CapSet^{C^}` becomes `CapSet^{C^} <: CapSet^{C^}`, and `A <: B` becomes
`CapSet^{A^} <: CapSet^{B^}` if both `A` and `B` are capture variables.
Supersedes #22183 and
#22289. This solution is overall
cleaner and does not require adding a new bit to the TypeComparer's
ApproxState.
TODOs/Issues/Questions:
- [x] Fix extension method in test
[cc-poly-varargs.scala](https://github.com/dotty-staging/dotty/blob/capture-subtyping-canon/tests/pos-custom-args/captures/cc-poly-varargs.scala).
Currently causes an infinite regress.
- [x] Fix the aftermath
* tests/neg-custom-args/captures/lazylists-exceptions.scala
* tests/neg-custom-args/captures/exceptions.scala
* tests/neg-custom-args/captures/real-try.scala
* tests/run-custom-args/captures/colltest5
- [x] Some negative cases in test
[capture-vars-subtyping.scala](https://github.com/dotty-staging/dotty/blob/capture-subtyping-canon/tests/neg-custom-args/captures/capture-vars-subtyping.scala)
pass: `D <: E` fails, but its canonicalized form `CapSet^{D^} <:
CapSet^{E^}` now succeeds. Potential problem in the subcapturing
implementation.
- [x] ~Extend to intersection/unions `def f[C^, D^, E <: C | D, F <: C &
D](...) = ...` etc.~ Lacking good uses cases, not planned right now.
- [X] ~If we have `C^` declared in the current context, should there be
a difference between `C` vs. `C^` for subsequent mentions? We currently
do, but seems a bit too subtle for users.~ Will be addressed by a new
scheme for declaring capture variables using context bounds.
0 commit comments