Skip to content

Wrong erasure for SeqLiteral elements #4375

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
sir-wabbit opened this issue Apr 25, 2018 · 3 comments
Closed

Wrong erasure for SeqLiteral elements #4375

sir-wabbit opened this issue Apr 25, 2018 · 3 comments

Comments

@sir-wabbit
Copy link

object App {
  type Id[A] >: A <: A
  val a: List[_ >: Id[_]] = List(0)
  def main(args: Array[String]): Unit = {
    println(a)
  }
}
java.lang.AssertionError: assertion failed: Expected primitive types I - Ljava/lang/Object;
	at scala.Predef$.assert(Predef.scala:219)
	at scala.tools.nsc.backend.jvm.BTypes$BType.conformsTo(BTypes.scala:151)
	at scala.tools.nsc.backend.jvm.BTypes$BType.conformsTo$(BTypes.scala:112)
	at scala.tools.nsc.backend.jvm.BTypes$INT$.conformsTo(BTypes.scala:320)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.adapt(BCodeBodyBuilder.scala:897)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:435)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genArray(BCodeBodyBuilder.scala:783)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genArrayValue(BCodeBodyBuilder.scala:768)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:419)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.$anonfun$genLoadArguments$1(BCodeBodyBuilder.scala:1018)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.$anonfun$genLoadArguments$1$adapted(BCodeBodyBuilder.scala:1018)
	at scala.collection.immutable.List.foreach(List.scala:389)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoadArguments(BCodeBodyBuilder.scala:1018)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genNormalMethodCall$1(BCodeBodyBuilder.scala:725)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genApply(BCodeBodyBuilder.scala:754)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:337)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.$anonfun$genLoadArguments$1(BCodeBodyBuilder.scala:1018)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.$anonfun$genLoadArguments$1$adapted(BCodeBodyBuilder.scala:1018)
	at scala.collection.immutable.List.foreach(List.scala:389)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoadArguments(BCodeBodyBuilder.scala:1018)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genNormalMethodCall$1(BCodeBodyBuilder.scala:725)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genApply(BCodeBodyBuilder.scala:754)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:337)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genStat(BCodeBodyBuilder.scala:77)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.$anonfun$genBlock$1(BCodeBodyBuilder.scala:860)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.$anonfun$genBlock$1$adapted(BCodeBodyBuilder.scala:860)
	at scala.collection.immutable.List.foreach(List.scala:389)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genNormalBlock$1(BCodeBodyBuilder.scala:860)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genBlock(BCodeBodyBuilder.scala:892)
	at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:408)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.emitNormalMethodBody$1(BCodeSkelBuilder.scala:602)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genDefDef(BCodeSkelBuilder.scala:635)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:506)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.$anonfun$gen$1(BCodeSkelBuilder.scala:508)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.$anonfun$gen$1$adapted(BCodeSkelBuilder.scala:508)
	at scala.collection.immutable.List.foreach(List.scala:389)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:508)
	at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genPlainClass(BCodeSkelBuilder.scala:116)
	at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.visit(GenBCode.scala:224)
	at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.run(GenBCode.scala:191)
	at dotty.tools.backend.jvm.GenBCodePipeline.buildAndSendToDisk(GenBCode.scala:421)
	at dotty.tools.backend.jvm.GenBCodePipeline.run(GenBCode.scala:387)
	at dotty.tools.backend.jvm.GenBCode.run(GenBCode.scala:69)
	at dotty.tools.dotc.core.Phases$Phase.$anonfun$runOn$1(Phases.scala:295)
	at scala.collection.immutable.List.map(List.scala:283)
	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:293)
	at dotty.tools.dotc.core.Phases$Phase.runOn$(Phases.scala:292)
	at dotty.tools.backend.jvm.GenBCode.runOn(GenBCode.scala:74)
	at dotty.tools.dotc.Run.$anonfun$compileUnits$3(Run.scala:174)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.util.Stats$.trackTime(Stats.scala:47)
	at dotty.tools.dotc.Run.$anonfun$compileUnits$2(Run.scala:171)
	at dotty.tools.dotc.Run.$anonfun$compileUnits$2$adapted(Run.scala:169)
	at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:32)
	at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:29)
	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:191)
	at dotty.tools.dotc.Run.runPhases$1(Run.scala:169)
	at dotty.tools.dotc.Run.$anonfun$compileUnits$1(Run.scala:194)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:88)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:149)
	at dotty.tools.dotc.Run.compileSources(Run.scala:136)
	at dotty.tools.dotc.Run.compile(Run.scala:120)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:29)
	at dotty.tools.dotc.Driver.process(Driver.scala:127)
	at dotty.tools.dotc.Driver.process(Driver.scala:96)
	at dotty.tools.dotc.Driver.process(Driver.scala:108)
	at dotty.tools.dotc.Driver.main(Driver.scala:135)
	at dotty.tools.dotc.Main.main(Main.scala)
@Blaisorblade Blaisorblade self-assigned this Apr 25, 2018
@Blaisorblade
Copy link
Contributor

Minimizable further to

object App {
  type Id[A] >: A <: A
  val a: List[_ >: Id[_]] = List(0)
}

First impression: Per restrictions on existentials, we should probably reject Id[_] altogether — it can't be translated to a type using wildcard — or approximate it, by simplifying it to _ and approximating according to variance. If we did that, we'd get

object App {
  type Id[A] >: A <: A
  val a: List[_ >: Nothing] = List(0) // bound comes from >: Id[_] and could be erased
  def main(args: Array[String]): Unit = {
    println(a)
  }
}

which is accepted by the REPL.

Worse, if we replace the definition of Id by an equivalent one, the program is already rejected:

object App {
  type Id[A] = A
  val a: List[_ >: Id[_]] = List(0)
}
3 |    val a: List[_ >: Id[_]] = List(0)
  |                     ^^^^^
  |unreducible application of higher-kinded type [A] => A to wildcard arguments

@Blaisorblade Blaisorblade changed the title AssertionError in backend AssertionError in backend after unreducible application to wildcard arguments escapes typer Apr 25, 2018
@smarter
Copy link
Member

smarter commented Apr 25, 2018

The Id[_] isn't needed to reproduce the crash, it's a bug in erasure.

object App {
  type Id[A] >: A
  val a: List[_ >: Id[Int]] = List(1,2)
}

I'm on it.

@Blaisorblade Blaisorblade removed their assignment Apr 25, 2018
@smarter
Copy link
Member

smarter commented Apr 25, 2018

@Blaisorblade However, the fact that Id[_] does not lead to an unreducible application error might be a separate issue too.

@smarter smarter changed the title AssertionError in backend after unreducible application to wildcard arguments escapes typer Wrong erasure for SeqLiteral elements Apr 26, 2018
smarter added a commit to dotty-staging/dotty that referenced this issue Apr 26, 2018
Before this commit, the `SeqLiteral#elems` were typed based on the
SeqLiteral prototype, which means that nothing ensured that the elems
types conformed to the type of `SeqLiteral#elemtpt`. In i4375.scala this
means that erasing `SeqLiteral([1, 2], Object)` did not box each element
because the expected element type was `WildcardType`.

To prevent this sort of issue, we now use the type of SeqLiteral#elemtpt
if it exists as the expected type of each element in the sequence.
odersky added a commit that referenced this issue Apr 27, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants