Skip to content

Regression in erasure for typelevel/spotted-leopards #23616

@WojciechMazur

Description

@WojciechMazur

Based on OpenCB failure in typelevel/spotted-leopards - build logs

Compiler version

Last good release: 3.7.3-RC1-bin-20250726-1148afe-NIGHTLY
First bad release: 3.7.3-RC1-bin-20250728-95b37a7-NIGHTLY
Bisect points to ef84d41 / #21890

Minimized code

trait Apply[F[_]]:
  extension [A](fa: F[A])
    def map[B](f: A => B): F[B]
    def map2[B, Z](fb: F[B])(f: (A, B) => Z): F[Z] = ???

  private case class IsMap[T <: Tuple](value: Tuple.Map[T, F])
  private inline def tupledGeneric[T <: Tuple](tuple: Tuple.Map[T, F]): F[T] = 
    inline IsMap(tuple) match
      case t: IsMap[h *: EmptyTuple] => t.value.head.map(_ *: EmptyTuple)
      case t: IsMap[h *: t] =>
        val head = t.value.head
        val tail = tupledGeneric(t.value.tail)
        head.map2(tail)(_ *: _)

trait Monad[F[_]] extends Apply[F]:
  extension [A](fa: F[A]) def flatMap[B](f: A => F[B]): F[B]
  extension [A](fa: F[A]) override def map[B](f: A => B): F[B] = ???

opaque type Kleisli[F[_], A, B] = A => F[B]
given [F[_], A](using F: Monad[F]): Monad[[B] =>> Kleisli[F, A, B]] with
  extension [B](k: Kleisli[F, A, B])
    def flatMap[C](f: B => Kleisli[F, A, C]) = ???

Output

  unhandled exception while running MegaPhase{elimErasedValueType, pureStats, vcElideAllocations, etaReduce, arrayApply, elimPolyFunction, tailrec, completeJavaEnums, mixin, lazyVals, memoize, nonLocalReturns, capturedVars} on /Users/wmazur/projects/scala/community-build3/example.scala

  An unhandled exception was thrown in the compiler.
  Please file a crash report here:
  https://github.com/scala/scala3/issues/new/choose
  For non-enriched exceptions, compile with -Xno-enrich-error-messages.


     while compiling: /Users/wmazur/projects/scala/community-build3/example.scala
        during phase: MegaPhase{elimErasedValueType, pureStats, vcElideAllocations, etaReduce, arrayApply, elimPolyFunction, tailrec, completeJavaEnums, mixin, lazyVals, memoize, nonLocalReturns, capturedVars}
                mode: Mode(ImplicitsEnabled)
     library version: version 2.13.16
    compiler version: version 3.7.3-RC1-bin-20250728-95b37a7-NIGHTLY-git-95b37a7
            settings: -classpath /Users/wmazur/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.7.3-RC1-bin-20250728-95b37a7-NIGHTLY/scala3-library_3-3.7.3-RC1-bin-20250728-95b37a7-NIGHTLY.jar:/Users/wmazur/.sdkman/candidates/scala/current/maven2/org/scala-lang/scala-library/2.13.16/scala-library-2.13.16.jar -d /Users/wmazur/projects/scala/community-build3/.scala-build/community-build3_8234e07519-990a7af3ef/classes/main -sourceroot /Users/wmazur/projects/scala/community-build3

Exception in thread "main" java.lang.AssertionError: assertion failed
        at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11)
        at dotty.tools.dotc.core.Types$MethodType.<init>(Types.scala:4160)
        at dotty.tools.dotc.core.Types$CachedMethodType.<init>(Types.scala:4183)
        at dotty.tools.dotc.core.Types$MethodTypeCompanion.apply(Types.scala:4263)
        at dotty.tools.dotc.core.Types$MethodTypeCompanion.apply(Types.scala:4262)
        at dotty.tools.dotc.core.Types$LambdaTypeCompanion.apply(Types.scala:4195)
        at dotty.tools.dotc.core.TypeErasure.eraseInfo(TypeErasure.scala:823)
        at dotty.tools.dotc.core.TypeErasure$.transformInfo(TypeErasure.scala:277)
        at dotty.tools.dotc.transform.Mixin.mkMixinForwarderSym$1(Mixin.scala:334)
        at dotty.tools.dotc.transform.Mixin.mixinForwarders$1$$anonfun$2(Mixin.scala:318)
        at scala.collection.Iterator$$anon$9.next(Iterator.scala:584)
        at scala.collection.immutable.List.prependedAll(List.scala:156)
        at scala.collection.immutable.List$.from(List.scala:685)
        at scala.collection.immutable.List$.from(List.scala:682)
        at scala.collection.IterableOps$WithFilter.map(Iterable.scala:900)
        at dotty.tools.dotc.transform.Mixin.mixinForwarders$1(Mixin.scala:315)
        at dotty.tools.dotc.transform.Mixin.$anonfun$6(Mixin.scala:354)
        at scala.collection.immutable.List.flatMap(List.scala:294)
        at dotty.tools.dotc.transform.Mixin.transformTemplate(Mixin.scala:346)
        at dotty.tools.dotc.transform.Mixin.transformTemplate(Mixin.scala:196)
        at dotty.tools.dotc.transform.MegaPhase.goTemplate(MegaPhase.scala:1071)
        at dotty.tools.dotc.transform.MegaPhase.goTemplate(MegaPhase.scala:1072)
        at dotty.tools.dotc.transform.MegaPhase.goTemplate(MegaPhase.scala:1072)
        at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:377)
        at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:454)
        at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:272)
        at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:452)
        at dotty.tools.dotc.transform.MegaPhase.loop$1(MegaPhase.scala:465)
        at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:465)
        at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:376)
        at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:454)
        at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:272)
        at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:452)
        at dotty.tools.dotc.transform.MegaPhase.loop$1(MegaPhase.scala:465)
        at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:465)
        at dotty.tools.dotc.transform.MegaPhase.mapPackage$1(MegaPhase.scala:396)
        at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:399)
        at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:454)
        at dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:481)
        at dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:493)
        at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:386)
        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:334)
        at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:379)
        at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:368)
        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:1324)
        at dotty.tools.dotc.Run.runPhases$1(Run.scala:361)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$1$$anonfun$2(Run.scala:408)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$1$$anonfun$adapted$1(Run.scala:408)
        at scala.Function0.apply$mcV$sp(Function0.scala:42)
        at dotty.tools.dotc.Run.showProgress(Run.scala:470)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:408)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:420)
        at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:69)
        at dotty.tools.dotc.Run.compileUnits(Run.scala:420)
        at dotty.tools.dotc.Run.compileSources(Run.scala:307)
        at dotty.tools.dotc.Run.compile(Run.scala:292)
        at dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
        at dotty.tools.dotc.Driver.process(Driver.scala:201)
        at dotty.tools.dotc.Driver.process(Driver.scala:169)
        at dotty.tools.dotc.Driver.process(Driver.scala:181)
        at dotty.tools.dotc.Driver.main(Driver.scala:211)
        at dotty.tools.dotc.Main.main(Main.scala)
Compilation failed

Expectation

Should compile

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions