Skip to content

Runtime crash: incorrect inline match resolution for intersection types with opaque types #23779

@jchyb

Description

@jchyb

Compiler version

any

Minimized code

object Test:
  opaque type ExtraString = String
  opaque type NumString <: ExtraString = String
  opaque type OtherString <: ExtraString = String

  def makeExtraString(): String & ExtraString = "not a number"

  extension (t: NumString)
    def number: Double =
      (t : String).toDouble

  extension [T1 <: ExtraString](inline a: T1)
    inline def test: ExtraString =
      inline a match
        case x: NumString =>
          println(x.number) // runtime crash stack trace points here
          x
        case x: ExtraString =>
          println("expected behavior")
          x
    end test

end Test

import Test.*

@main def main() =
  val m1: String & ExtraString = makeExtraString()
  m1.test

Output

runtime output:

Exception in thread "main" java.lang.NumberFormatException: For input string: "not a number"
        at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
        at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
        at java.base/java.lang.Double.parseDouble(Double.java:651)
        at scala.collection.StringOps$.toDouble$extension(StringOps.scala:951)
        at Test$.number(X2.scala:11)
        at X2$package$.main(X2.scala:17)
        at main.main(X2.scala:28)

Expectation

Print out "expected behavior"

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions