Closed
Description
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 !