scala / bug

Scala 2 bug reports only. Please, no questions — proper bug reports only.
https://scala-lang.org
230 stars 21 forks source link

Using @unchecked on an Array returned by a matching pattern causes compiler crash when referencing the array from a method inside the method. #12794

Open noresttherein opened 1 year ago

noresttherein commented 1 year ago

Reproduction steps

Scala version: 2.13.10

object HasArray {
    def unapply[A](items :IterableOnce[A]) :Option[Array[_]] = ???
}

class Val[A](val self :IterableOnce[A]) {
    def boo :Unit = self match {
        case HasArray(array :Array[A]@unchecked) =>
            def inner = {
                array(0)
            }
    }
}

Problem

scalac: 
  scala.Array.apply : Object, Object, Any
     while compiling: /home/turin/porn/sugar/src/test/scala/Playground.scala
        during phase: globalPhase=jvm, enteringPhase=typer
     library version: version 2.13.10
    compiler version: version 2.13.10
  reconstructed args: -feature -Wconf:cat=deprecation&msg=foldLeft:silent -Wconf:cat=deprecation&msg=foldRight:silent -Wconf:cat=deprecation:w -Wconf:cat=feature:w -Wconf:cat=feature:w -Wconf:cat=deprecation:ws -Wconf:cat=feature:ws -Wconf:cat=optimizer:ws -Wunused:patvars -Wunused:privates -Wunused:locals -Xlint:nullary-unit -Xlint:poly-implicit-overload -Xlint:option-implicit -Xlint:delayedinit-select -Xlint:implicit-not-found -classpath /home/turin/porn/sugar/target/scala-2.13/test-classes:/home/turin/porn/sugar/target/scala-2.13/classes:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.13/2.3.10/shapeless_2.13-2.3.10.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.14.2/byte-buddy-1.14.2.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.9.0/jna-5.9.0.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline/3.21.0/jline-3.21.0.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.13/2.1.0/scala-xml_2.13-2.1.0.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.10/scala-compiler-2.13.10.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.10/scala-reflect-2.13.10.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalacheck/scalacheck_2.13/1.17.0/scalacheck_2.13-1.17.0.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalactic/scalactic_2.13/3.2.15/scalactic_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-compatible/3.2.15/scalatest-compatible-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-core_2.13/3.2.15/scalatest-core_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-diagrams_2.13/3.2.15/scalatest-diagrams_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-featurespec_2.13/3.2.15/scalatest-featurespec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-flatspec_2.13/3.2.15/scalatest-flatspec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-freespec_2.13/3.2.15/scalatest-freespec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-funspec_2.13/3.2.15/scalatest-funspec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-funsuite_2.13/3.2.15/scalatest-funsuite_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-matchers-core_2.13/3.2.15/scalatest-matchers-core_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-mustmatchers_2.13/3.2.15/scalatest-mustmatchers_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-propspec_2.13/3.2.15/scalatest-propspec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-refspec_2.13/3.2.15/scalatest-refspec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-shouldmatchers_2.13/3.2.15/scalatest-shouldmatchers_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest-wordspec_2.13/3.2.15/scalatest-wordspec_2.13-3.2.15.jar:/home/turin/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scalatest/scalatest_2.13/3.2.15/scalatest_2.13-3.2.15.jar -language:existentials -language:higherKinds -language:implicitConversions -language:reflectiveCalls -Vimplicits -Vreflective-calls

  last tree to typer: Literal(Constant(1))
       tree position: line 8 of /home/turin/porn/sugar/src/test/scala/Playground.scala
            tree tpe: Int(1)
              symbol: null
           call site: constructor Playground in object Playground in package <empty>

== Source file context for tree position ==

     5 
     6 class Val[A](val self :IterableOnce[A]) {
     7  def boo :Unit = self match {
     8      case HasArray(array :Array[A] @unchecked) =>
     9          def inner = {
    10              array(0)
    11          }

Dropping : Array[A] @unchecked, or moving it out of inner method fixes the issue.

lrytz commented 1 year ago

Stack by -Vdebug

    at scala.reflect.internal.Reporting.abort(Reporting.scala:69)
    at scala.reflect.internal.Reporting.abort$(Reporting.scala:65)
    at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:28)
    at scala.tools.nsc.backend.ScalaPrimitives.$anonfun$getPrimitive$3(ScalaPrimitives.scala:557)
    at scala.tools.nsc.backend.ScalaPrimitives.$anonfun$getPrimitive$2(ScalaPrimitives.scala:557)
    at scala.tools.nsc.backend.ScalaPrimitives.elementType$1(ScalaPrimitives.scala:553)
    at scala.tools.nsc.backend.ScalaPrimitives.getPrimitive(ScalaPrimitives.scala:563)
    at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genPrimitiveOp(BCodeBodyBuilder.scala:233)
    at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genApply(BCodeBodyBuilder.scala:711)