Closed Swoorup closed 3 years ago
Looks like we'll have to drop or relax the assert (by adding || ctx.reporter.errorsReported
?) at https://github.com/lampepfl/dotty/blob/cc47c561aaad004e56d25f2388058c0e69356a58/compiler/src/dotty/tools/dotc/core/TyperState.scala#L146 because some error messages can capture a context containing a TyperState that is already committed, and forcing the error can end up creating and committing a TyperState into that already committed TyperState.
A self-contained reproducer:
trait Vehicle
trait Car extends Vehicle
trait Encoder[A]
object Encoder {
implicit val encodeVehicle: Encoder[Vehicle] = ???
implicit val encodeCar: Encoder[Car] = ???
}
trait Route
trait Printer
trait Marshaller[-A] // must be contravariant
object Test {
implicit def marshaller[A: Encoder](implicit p: Printer = ???): Marshaller[A] = ???
// the `Printer` implicit arg seems to be necessary, either with default value, or no implicit in scope
def foo[A](v: A)(implicit m: Marshaller[A]): Route = ???
val route: Route = identity {
val f: (Car => Route) => Route = ??? // ok if s/Car/Vehicle/
f(vehicle => foo(vehicle))
}
}
$ dotc -version
Scala compiler version 3.0.3-RC1-bin-SNAPSHOT-git-cc47c56 -- Copyright 2002-2021, LAMP/EPFL
$ dotc i13101.scala
exception occurred while typechecking i13101.scala
exception occurred while compiling i13101.scala
java.lang.AssertionError: assertion failed: Attempt to commit TS[203X, 18X, 16, 1, 0] into already committed TS[18X, 16, 1, 0] while compiling i13101.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: Attempt to commit TS[203X, 18X, 16, 1, 0] into already committed TS[18X, 16, 1, 0]
at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
at dotty.tools.dotc.core.TyperState.commit(TyperState.scala:146)
at dotty.tools.dotc.typer.Inferencing$.isFullyDefined(Inferencing.scala:40)
at dotty.tools.dotc.typer.Implicits.ignoredInstanceNormalImport$1(Implicits.scala:881)
at dotty.tools.dotc.typer.Implicits.$anonfun$1(Implicits.scala:896)
at dotty.tools.dotc.typer.ImplicitSearchError.hiddenImplicitsAddendum(ErrorReporting.scala:419)
at dotty.tools.dotc.typer.ImplicitSearchError.missingArgMsg(ErrorReporting.scala:267)
at dotty.tools.dotc.typer.Implicits.missingArgMsg(Implicits.scala:897)
at dotty.tools.dotc.typer.Implicits.missingArgMsg$(Implicits.scala:774)
at dotty.tools.dotc.typer.Typer.missingArgMsg(Typer.scala:106)
at dotty.tools.dotc.typer.Typer.issueErrors$1$$anonfun$1$$anonfun$1(Typer.scala:3353)
at dotty.tools.dotc.reporting.NoExplanation.msg(Message.scala:132)
at dotty.tools.dotc.reporting.Message.message(Message.scala:87)
at dotty.tools.dotc.reporting.Message.isNonSensical(Message.scala:99)
at dotty.tools.dotc.reporting.HideNonSensicalMessages.isHidden(HideNonSensicalMessages.scala:16)
at dotty.tools.dotc.reporting.HideNonSensicalMessages.isHidden$(HideNonSensicalMessages.scala:10)
at dotty.tools.dotc.reporting.AbstractReporter.isHidden(AbstractReporter.scala:8)
at dotty.tools.dotc.reporting.Reporter.report(Reporter.scala:148)
at dotty.tools.dotc.reporting.Reporter.flush$$anonfun$1(Reporter.scala:206)
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.dotc.reporting.Reporter.flush(Reporter.scala:206)
at dotty.tools.dotc.core.TyperState.commit(TyperState.scala:143)
at dotty.tools.dotc.typer.Applications.fail$1(Applications.scala:986)
at dotty.tools.dotc.typer.Applications.realApply$7$$anonfun$6$$anonfun$2(Applications.scala:992)
at scala.Option.getOrElse(Option.scala:201)
at dotty.tools.dotc.typer.Applications.realApply$8$$anonfun$7(Applications.scala:993)
at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:2952)
at dotty.tools.dotc.typer.Applications.realApply$1(Applications.scala:994)
at dotty.tools.dotc.typer.Applications.typedApply(Applications.scala:1032)
at dotty.tools.dotc.typer.Applications.typedApply$(Applications.scala:317)
at dotty.tools.dotc.typer.Typer.typedApply(Typer.scala:106)
at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2693)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2756)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2821)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2825)
at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2941)
at dotty.tools.dotc.typer.Typer.typedValDef(Typer.scala:2092)
at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2667)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2755)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2821)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2825)
at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2847)
at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2897)
at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2352)
at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2681)
at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2685)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2755)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2821)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2825)
at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2847)
at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2897)
at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2475)
at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2726)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2756)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2821)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2825)
at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2941)
at dotty.tools.dotc.typer.FrontEnd.liftedTree1$1(FrontEnd.scala:79)
at dotty.tools.dotc.typer.FrontEnd.typeCheck$$anonfun$1(FrontEnd.scala:84)
at dotty.tools.dotc.typer.FrontEnd.monitor(FrontEnd.scala:43)
at dotty.tools.dotc.typer.FrontEnd.typeCheck(FrontEnd.scala:85)
at dotty.tools.dotc.typer.FrontEnd.runOn$$anonfun$3(FrontEnd.scala:120)
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.dotc.typer.FrontEnd.runOn(FrontEnd.scala:120)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:205)
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:1323)
at dotty.tools.dotc.Run.runPhases$5(Run.scala:216)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:224)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
at dotty.tools.dotc.Run.compileUnits(Run.scala:231)
at dotty.tools.dotc.Run.compileSources(Run.scala:166)
at dotty.tools.dotc.Run.compile(Run.scala:150)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
at dotty.tools.dotc.Driver.process(Driver.scala:199)
at dotty.tools.dotc.Driver.process(Driver.scala:167)
at dotty.tools.dotc.Driver.process(Driver.scala:179)
at dotty.tools.dotc.Driver.main(Driver.scala:209)
at dotty.tools.dotc.Main.main(Main.scala)
Compiler version
Tried both
3.0.1
and3.0.2-RC1
Minimized code
See below https://github.com/lampepfl/dotty/issues/13101#issuecomment-882932439
Output (click arrow to expand)