Skip to content

False unreachable warning when matching alternative projection types #18661

Closed
@swaldman

Description

@swaldman

Compiler version

3.3.1

Minimized code

While attempting a workaround of #18655 (thanks @aly!), the compiler emits a false warning that code is unreachable, even though the program it generates does correctly reach that code.

//> using scala 3.3.1

class Jacket[T]:
  sealed trait BodyType:
    sealed trait OrganType:
      case class Heart() extends Body.Organ
      case class Brain() extends Body.Organ
    object Organ extends OrganType
    sealed trait Organ
  object Body extends BodyType
  sealed trait Body

type AnyJacket         = Jacket[?]
type AnyBodyOrgan      = AnyJacket#BodyType#Organ
type AnyBodyOrganHeart = AnyJacket#BodyType#OrganType#Heart
type AnyBodyOrganBrain = AnyJacket#BodyType#OrganType#Brain

def check( asr : AnyBodyOrgan ) : String =
  asr match
    case c : AnyBodyOrganHeart => "Heart"
    case s : AnyBodyOrganBrain => "Brain"

val jacket = new Jacket[Unit]
val heart = new jacket.Body.Organ.Heart()
val brain = new jacket.Body.Organ.Brain()

@main
def go =
  println( check( heart ) )
  println( check( brain ) )  

Output

% scala-cli run spurious-warning-jacket.scala
[warn] ./spurious-warning-jacket.scala:24:10
[warn] Unreachable case
[warn]     case s : AnyBodyOrganBrain => "Brain"
[warn]          ^^^^^^^^^^^^^^^^^^^^^
Heart
Brain

Expectation

The code should execute precisely as it does, but the compiler shouldn't emit a warning complaining that it won't reach a case it correctly reaches.

Notes

Eliminating the type parameter on Jacket eliminates the warning. Making the nesting thinner (e.g. AnyJacket#BodyPartType#Heart rather than AnyJacket#BodyType#OrganType#Heart) eliminates the warning. Whatever triggers it is persnickety.

Thanks!

Thanks to @aly on the Scala discord for suggesting this effective (putting aside the ugly warning) workaround to #18655 !

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions