Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't GLB binders of type patterns, use the type directly #10247

Merged
merged 1 commit into from Jan 11, 2023

Commits on Dec 22, 2022

  1. Don't GLB binders of type patterns, use the type directly

    In type patterns `c match { case x: T }`, the translation would assign
    the GLB of `c`'s type and `T` to the varaible `x`.
    
    This seems to trace back to the first version of the "virtual pattern
    matcher". I could not find a similar use of `glb` in that revision
    of the codebase. So I'm not sure if it was a new addition, or picked
    up from the previous implementation.
    
    https://github.com/scala/scala/blob/8a9fd64129926eea35f7dca181242855f14e153f/src/compiler/scala/tools/nsc/typechecker/PatMatVirtualiser.scala#L438-L440
    
    In the test case, the GLB collapsed to `Null` because its
    computation failed (combination of f-bounds, existentials, skolems that
    I don't follow), see `throw GlbFailure`. This is how it's been for 14
    years (b894f80). This resulted in a cast to `Null$` failing at
    runtime.
    
    I assume GLB is fixed in Scala 3, as this core of the type system has
    a new implementation. But the test case as such doesn't compile in
    Scala 3 due to the non-wildcard existential.
    lrytz committed Dec 22, 2022
    Configuration menu
    Copy the full SHA
    84bf5ca View commit details
    Browse the repository at this point in the history