Skip to content

erasure(Array[Int] | Array[Float]) == Array[Object] #1065

Closed
@sjrd

Description

@sjrd

I minimized the bug in the problematic test t3833.scala from #1061 to something that does not even require a Match. It can be reproduced with an If:

package hello

object world {
  def mkArray(atype: Int): Array[_ <: AnyVal] = {
    (if (atype == 1) new Array[Int](10) else new Array[Float](10))
  }

  def main(args: Array[String]): Unit = {
    println(mkArray(1))
  }
}

This causes an assertion in the back-end. We can see that the types are wrong as early as after erasure: (grep for HERE)

> run -Xprint:erasure -Xprint-types examples/hello.scala
[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list
[info] Packaging /localhome/doeraene/projects/dotty/target/scala-2.11/dotty_2.11-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running dotty.tools.dotc.Main -Xprint:erasure -Xprint-types examples/hello.scala
[error] result of examples/hello.scala after erasure:
[error] <package <hello:hello> {
[error]   final lazy module val world: hello.world$ = 
[error]     <<<new hello.world$:hello.world$>:(()hello.world$)>():hello.world$>
[error]   final module class world$() extends <<<new Object:Object>:(()Object)>():Object
[error]     >
[error]    { this: <notype> => 
[error]     def mkArray(atype: Int): Object = <{
[error]       <if <<<atype:Int>.==:((x: Int)Boolean)>(<1:Int>):Boolean> then 
[error]         <
[error]           <<dotty.runtime.Arrays:dotty.runtime.Arrays$>.newIntArray:
[error]             ((length: Int)Int[])
[error]           >
[error]         (<10:Int>):Int[]>
[error]        else 
[error]         <
[error]           <<dotty.runtime.Arrays:dotty.runtime.Arrays$>.newFloatArray:
[error]             ((length: Int)Float[])
[error]           >
[error]         (<10:Int>):Float[]>
[error]       :Object[]> // <-- HERE, not good, should be Object
[error]     }:Object[]> // <-- Same here
[error]     def main(args: String[]): Unit = <{
[error]       <<println:((x: Object)Unit)>(
[error]         <<hello.world.mkArray:((atype: Int)Object)>(<1:Int>):Object>
[error]       ):Unit>
[error]     }:Unit>
[error]   }
[error] }:hello.type>

The complete stack trace of the error is:

[error] java.lang.AssertionError: assertion failed: Expected primitive types I - Ljava/lang/Object;
[error]         at scala.Predef$.assert(Predef.scala:165)
[error]         at scala.tools.nsc.backend.jvm.BTypes$BType$class.conformsTo(BTypes.scala:157)
[error]         at scala.tools.nsc.backend.jvm.BTypes$ArrayBType.conformsTo(BTypes.scala:847)
[error]         at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.adapt(BCodeBodyBuilder.scala:896)
[error]         at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:436)
[error]         at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoadIf(BCodeBodyBuilder.scala:217)
[error]         at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:300)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.emitNormalMethodBody$1(BCodeSkelBuilder.scala:607)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genDefDef(BCodeSkelBuilder.scala:641)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:510)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder$$anonfun$gen$1.apply(BCodeSkelBuilder.scala:512)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder$$anonfun$gen$1.apply(BCodeSkelBuilder.scala:512)
[error]         at scala.collection.immutable.List.foreach(List.scala:381)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:512)
[error]         at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genPlainClass(BCodeSkelBuilder.scala:119)
[error]         at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.visit(GenBCode.scala:177)
[error]         at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.run(GenBCode.scala:130)
[error]         at dotty.tools.backend.jvm.GenBCodePipeline.buildAndSendToDisk(GenBCode.scala:334)
[error]         at dotty.tools.backend.jvm.GenBCodePipeline.run(GenBCode.scala:300)
[error]         at dotty.tools.backend.jvm.GenBCode.run(GenBCode.scala:42)
[error]         at dotty.tools.dotc.core.Phases$Phase$$anonfun$runOn$1.apply(Phases.scala:271)
[error]         at dotty.tools.dotc.core.Phases$Phase$$anonfun$runOn$1.apply(Phases.scala:269)
[error]         at scala.collection.immutable.List.map(List.scala:273)
[error]         at dotty.tools.dotc.core.Phases$Phase$class.runOn(Phases.scala:269)
[error]         at dotty.tools.backend.jvm.GenBCode.runOn(GenBCode.scala:35)
[error]         at dotty.tools.dotc.Run$$anonfun$compileUnits$1$$anonfun$apply$mcV$sp$1.apply(Run.scala:60)
[error]         at dotty.tools.dotc.Run$$anonfun$compileUnits$1$$anonfun$apply$mcV$sp$1.apply(Run.scala:57)
[error]         at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
[error]         at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
[error]         at dotty.tools.dotc.Run$$anonfun$compileUnits$1.apply$mcV$sp(Run.scala:57)
[error]         at dotty.tools.dotc.Run$$anonfun$compileUnits$1.apply(Run.scala:52)
[error]         at dotty.tools.dotc.Run$$anonfun$compileUnits$1.apply(Run.scala:52)
[error]         at dotty.tools.dotc.util.Stats$.monitorHeartBeat(Stats.scala:69)
[error]         at dotty.tools.dotc.Run.compileUnits(Run.scala:52)
[error]         at dotty.tools.dotc.Run.compileSources(Run.scala:49)
[error]         at dotty.tools.dotc.Run.compile(Run.scala:33)
[error]         at dotty.tools.dotc.Driver.doCompile(Driver.scala:21)
[error]         at dotty.tools.dotc.Driver.process(Driver.scala:47)
[error]         at dotty.tools.dotc.Driver.process(Driver.scala:57)
[error]         at dotty.tools.dotc.Driver.main(Driver.scala:65)
[error]         at dotty.tools.dotc.Main.main(Main.scala)
[error] error: Error while emitting hello.scala
[error] assertion failed: Expected primitive types I - Ljava/lang/Object;
[error] one error found

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions