,
> i've hinted that there is an issue with intersection type and totality, but
> we did not follow up.
>
> Here is the issue
> var value = flag? "foo": 42;
> switch(value) {
> case String s -> ...
> case Integer i -> ...
> case Serializable s ->
> case Comparable<?> c ->
> }
>
> given that the type of value is an intersection type Serializable &
> Comparable<?> & ...
> the last two cases are total with respect to the type of value. which does
> not go well with the current semantics that can only have one total case.
Let’s separate the issues here. The type involved is an infinite type, which I
think we can agree is a distraction. But lets assume the type of value were
Serializable&Comparable (S&C for short.)
Because S&C <: S, the `case S` in your example is already total, so the `case
C` should be a dead case and yield a compilation error. According to the rule
we have, `case S` is total on any U <: S, so it is total on S&C, so the current
model covers this, and the `case C` is identified as dead by the compiler.
Which makes sense because there’s no value it can match.
I’m not seeing the problem?