Skip to content

Nothing and dependent types interplay: assertion failed in the compiler #15377

Closed
@p-pavel

Description

@p-pavel

Compiler version

3.1.2

Minimized code

trait Tst:
  val a: Int

trait Q[A <: Tst]:
  def mk(a: A): a.a.type = a.a

object q extends Q[Nothing]

Output (click arrow to expand)

scalac: Error: assertion failed
java.lang.AssertionError: assertion failed
	at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11)
	at dotty.tools.dotc.core.Types$MethodType.<init>(Types.scala:3705)
	at dotty.tools.dotc.core.Types$CachedMethodType.<init>(Types.scala:3725)
	at dotty.tools.dotc.core.Types$MethodTypeCompanion.apply(Types.scala:3796)
	at dotty.tools.dotc.core.Types$MethodTypeCompanion.apply(Types.scala:3795)
	at dotty.tools.dotc.core.Types$LambdaType.newLikeThis(Types.scala:3478)
	at dotty.tools.dotc.core.Types$LambdaType.newLikeThis$(Types.scala:3411)
	at dotty.tools.dotc.core.Types$MethodOrPoly.newLikeThis(Types.scala:3491)
	at dotty.tools.dotc.core.Types$LambdaType.derivedLambdaType(Types.scala:3468)
	at dotty.tools.dotc.core.Types$LambdaType.derivedLambdaType$(Types.scala:3411)
	at dotty.tools.dotc.core.Types$MethodOrPoly.derivedLambdaType(Types.scala:3491)
	at dotty.tools.dotc.core.TypeErasure.dotty$tools$dotc$core$TypeErasure$$apply(TypeErasure.scala:642)
	at dotty.tools.dotc.core.TypeErasure.eraseInfo(TypeErasure.scala:717)
	at dotty.tools.dotc.core.TypeErasure$.transformInfo(TypeErasure.scala:244)
	at dotty.tools.backend.jvm.BCodeHelpers.dotty$tools$backend$jvm$BCodeHelpers$$getStaticForwarderGenericSignature(BCodeHelpers.scala:942)
	at dotty.tools.backend.jvm.BCodeHelpers$BCForwardersGen.addForwarder(BCodeHelpers.scala:530)
	at dotty.tools.backend.jvm.BCodeHelpers$BCForwardersGen.addForwarders$$anonfun$3(BCodeHelpers.scala:610)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.backend.jvm.BCodeHelpers$BCForwardersGen.addForwarders(BCodeHelpers.scala:612)
	at dotty.tools.backend.jvm.BCodeHelpers$BCForwardersGen.addForwarders$(BCodeHelpers.scala:506)
	at dotty.tools.backend.jvm.BCodeHelpers$JCommonBuilder.addForwarders(BCodeHelpers.scala:670)
	at dotty.tools.backend.jvm.BCodeHelpers$JMirrorBuilder.genMirrorClass(BCodeHelpers.scala:718)
	at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.visit(GenBCode.scala:250)
	at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.run(GenBCode.scala:224)
	at dotty.tools.backend.jvm.GenBCodePipeline.buildAndSendToDisk(GenBCode.scala:559)
	at dotty.tools.backend.jvm.GenBCodePipeline.run(GenBCode.scala:525)
	at dotty.tools.backend.jvm.GenBCode.run(GenBCode.scala:63)
	at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:308)
	at scala.collection.immutable.List.map(List.scala:246)
	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:309)
	at dotty.tools.backend.jvm.GenBCode.runOn(GenBCode.scala:71)
	at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:259)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1328)
	at dotty.tools.dotc.Run.runPhases$1(Run.scala:270)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:278)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:287)
	at dotty.tools.dotc.Run.compileSources(Run.scala:220)
	at dotty.tools.dotc.Run.compile(Run.scala:204)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
	at dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:88)
	at dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22)
	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)

Additional info

There's a general problem with handling paths when type is instantiated as Nothing. Here's the example I started from:

trait WithPath:
  type A

trait Proto:
  type A <: WithPath
  def func(a: A): a.A

object Impl extends Proto:
  type A = Nothing
  def func(a: A) = a

This can't be typed (but I think it should because surely Nothing <: WithPath).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions