Skip to content

ClassCastException under Scala 3 #233

@jodersky

Description

@jodersky

Matching on a None within a test leads to a ClassCastException under Scala 3.0.0-M3. A couple of notes:

  • this only happens when the match is defined directly in a test; it does not occur if the match is defined elsewhere (as can be seen in the "indirect" test below)
  • this type of error also manifests itself when matching on other wrapper types that extend some base type with a Nothing type parameter. E.g. matching Nil or Failure()
  • the error only occurs when matching None and the first case does not match (see snippet)
  • see this repository https://github.com/jodersky/utest-macro-bug for a self-contained project to reproduce the bug
import utest._
import scala.util.{
  Try, Success, Failure
}

object misc extends TestSuite {

  val tests = Tests {
    // this leads to a runtime error in utest under Scala 3.0.0-M3
    test("direct1") { // runtime error: java.lang.ClassCastException: class scala.None$ cannot be cast to class scala.Some
      (None: Option[Int]) match {
        case Some(a) =>
        case None =>
      }
    }
    test("direct2") { // works
      (None: Option[Int]) match {
        case None =>
        case Some(a) =>
      }
    }
    test("direct3") { // works
      (Some(1): Option[Int]) match {
        case Some(a) =>
        case None =>
      }
    }
    test("direct4") { // works
      (Some(1): Option[Int]) match {
        case None =>
        case Some(a) =>
      }
    }
    test("indirect") { // works
      runTest()
    }
  }

  def runTest() = {
    (None: Option[Int]) match {
      case Some(a) =>
      case None =>
    }
  }

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions