Skip to content

Improve Captureset Subtyping and Intervals #21999

Closed
@bracevac

Description

@bracevac

From discussions in PR #21875

Compiler version

Latest NIGHTLY

Minimized code

import language.experimental.captureChecking
import caps.*

trait Abstract[X >: Nothing]: // Concrete2 and 3 fail with this lower bound, but work with X >: CapSet^{}
    type C >: X <: CapSet^
    def boom(): Unit^{C^}

class Concrete extends Abstract[CapSet^{}]:
    type C = CapSet^{}
    def boom() = () // ok

class Concrete2 extends Abstract[CapSet^{}]:
    type C = CapSet^{} & CapSet^{}
    def boom() = () // error

class Concrete3 extends Abstract[CapSet^{}]:
    type C = CapSet^{} | CapSet^{}
    def boom() = () // error

Output

-- Error: local/i21868.scala:14:14 ---------------------------------------------
14 |    def boom() = () // error
   |              ^
   |          Illegal capture reference: (caps.CapSet^{}) & (caps.CapSet^{})
-- Error: local/i21868.scala:18:14 ---------------------------------------------
18 |    def boom() = () // error
   |              ^
   |          Illegal capture reference: (caps.CapSet^{}) | (caps.CapSet^{})

Expectation

  • I would expect those to work even if the lower bound of X in trait Abstract[X] is set to Nothing.
  • Can we make union and intersection on CapSet commute with capture set union and intersection, i.e., CapSet^c1 | CapSet^c2 <:> CapSet^(c1 | c2) and CapSet^c1 & CapSet^c2 <:> CapSet^(c1 & c2)? Probably, that involves improving normalizeCaptures in Setup.
  • Can we let the syntax C^ for declaring a type variable automatically desugar to the interval CapSet^{} <: C <: CapSet^?
    • Is this always airtight, or will it cause trouble?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions