Skip to content
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

"NoSuchElementException: key not found: LabelName<matchAlts1>" with dotty 0.27.0-RC1 #4171

Closed
xuwei-k opened this issue Aug 31, 2020 · 4 comments
Assignees
Labels
bug Confirmed bug. Needs to be fixed.
Milestone

Comments

@xuwei-k
Copy link
Contributor

xuwei-k commented Aug 31, 2020

step

build.sbt

scalaVersion := "0.27.0-RC1"

enablePlugins(ScalaJSPlugin)

scalaJSUseMainModuleInitializer := true

project/plugins.sbt

addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.1.1")
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.2")

project/build.properties

sbt.version=1.3.13

A.scala

package example

object A {
  def main(args: Array[String]): Unit = {
    (null: Any) match {
      case (_: Int) | (_: String) =>
    }
  }
}

execute sbt fastOptJS

log

[error] java.util.NoSuchElementException: key not found: LabelName<matchAlts1>
[error] 	at scala.collection.immutable.Map$Map2.apply(Map.scala:138)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$Env.lhsForLabeledExpr(FunctionEmitter.scala:2836)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.doReturnToLabel$1(FunctionEmitter.scala:1375)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1437)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1485)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.redo$1(FunctionEmitter.scala:1352)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1420)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.$anonfun$pushLhsInto$3(FunctionEmitter.scala:1477)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.extractLet$1(FunctionEmitter.scala:1367)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1474)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformStat(FunctionEmitter.scala:853)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformLoop$1(FunctionEmitter.scala:871)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformBlockStats(FunctionEmitter.scala:877)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1419)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformStat(FunctionEmitter.scala:853)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.desugarToFunctionInternal(FunctionEmitter.scala:495)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.$anonfun$desugarToFunction$1(FunctionEmitter.scala:467)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.performOptimisticThenPessimisticRuns(FunctionEmitter.scala:377)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.desugarToFunction(FunctionEmitter.scala:467)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter.desugarToFunction(FunctionEmitter.scala:259)
[error] 	at org.scalajs.linker.backend.emitter.ClassEmitter.genMethod(ClassEmitter.scala:489)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$genClass$20(Emitter.scala:456)
[error] 	at org.scalajs.linker.backend.emitter.Emitter$MethodCache.getOrElseUpdate(Emitter.scala:648)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$genClass$19(Emitter.scala:456)
[error] 	at scala.collection.TraversableLike$WithFilter.$anonfun$map$2(TraversableLike.scala:827)
[error] 	at scala.collection.immutable.List.foreach(List.scala:392)
[error] 	at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:826)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.genClass(Emitter.scala:449)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$emitOnce$3(Emitter.scala:174)
[error] 	at scala.collection.immutable.List.map(List.scala:290)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$emitOnce$2(Emitter.scala:174)
[error] 	at org.scalajs.logging.Logger.time(Logger.scala:42)
[error] 	at org.scalajs.logging.Logger.time$(Logger.scala:40)
[error] 	at org.scalajs.sbtplugin.Loggers$SbtLoggerWrapper.time(Loggers.scala:19)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emitOnce(Emitter.scala:174)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emitAvoidGlobalClash(Emitter.scala:148)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emitInternal(Emitter.scala:124)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emit(Emitter.scala:78)
[error] 	at org.scalajs.linker.backend.BasicLinkerBackend.$anonfun$emit$1(BasicLinkerBackend.scala:57)
[error] 	at org.scalajs.logging.Logger.time(Logger.scala:42)
[error] 	at org.scalajs.logging.Logger.time$(Logger.scala:40)
[error] 	at org.scalajs.sbtplugin.Loggers$SbtLoggerWrapper.time(Loggers.scala:19)
[error] 	at org.scalajs.linker.backend.BasicLinkerBackend.emit(BasicLinkerBackend.scala:57)
[error] 	at org.scalajs.linker.standard.StandardLinkerImpl.$anonfun$link$2(StandardLinkerImpl.scala:47)
[error] 	at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:307)
[error] 	at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
[error] 	at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
[error] 	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
[error] 	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[error] 	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[error] 	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
[error] 	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
[error] (Compile / fastOptJS) java.util.NoSuchElementException: key not found: LabelName<matchAlts1>

original report↓

step with scalaz

git clone git@github.com:scalaz/scalaz.git
cd scalaz
git checkout 82e3ae344582ba2e569a1ab5bc78ea8f26b9282e
sbt '++ 0.27.0-RC1!' rootJS/test:fastOptJS

log

https://travis-ci.com/github/scalaz/scalaz/jobs/379348358#L11125

[error] java.util.NoSuchElementException: key not found: LabelName<matchAlts1>
[error] 	at scala.collection.immutable.Map$Map2.apply(Map.scala:138)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$Env.lhsForLabeledExpr(FunctionEmitter.scala:2836)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.doReturnToLabel$1(FunctionEmitter.scala:1375)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1437)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1485)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.redo$1(FunctionEmitter.scala:1352)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1420)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.$anonfun$pushLhsInto$3(FunctionEmitter.scala:1477)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.extractLet$1(FunctionEmitter.scala:1367)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1474)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformStat(FunctionEmitter.scala:853)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformLoop$1(FunctionEmitter.scala:871)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.transformBlockStats(FunctionEmitter.scala:877)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1419)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1404)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.$anonfun$pushLhsInto$3(FunctionEmitter.scala:1477)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.extractLet$1(FunctionEmitter.scala:1367)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.pushLhsInto(FunctionEmitter.scala:1474)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.desugarToFunctionInternal(FunctionEmitter.scala:500)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.$anonfun$desugarToFunctionWithExplicitThis$1(FunctionEmitter.scala:455)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.performOptimisticThenPessimisticRuns(FunctionEmitter.scala:377)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter$JSDesugar.desugarToFunctionWithExplicitThis(FunctionEmitter.scala:451)
[error] 	at org.scalajs.linker.backend.emitter.FunctionEmitter.desugarToFunctionWithExplicitThis(FunctionEmitter.scala:271)
[error] 	at org.scalajs.linker.backend.emitter.ClassEmitter.genMethod(ClassEmitter.scala:491)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$genClass$5(Emitter.scala:387)
[error] 	at org.scalajs.linker.backend.emitter.Emitter$MethodCache.getOrElseUpdate(Emitter.scala:648)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$genClass$4(Emitter.scala:387)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$genClass$4$adapted(Emitter.scala:378)
[error] 	at scala.collection.immutable.List.foreach(List.scala:392)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.genClass(Emitter.scala:378)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$emitOnce$3(Emitter.scala:174)
[error] 	at scala.collection.immutable.List.map(List.scala:290)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.$anonfun$emitOnce$2(Emitter.scala:174)
[error] 	at org.scalajs.logging.Logger.time(Logger.scala:42)
[error] 	at org.scalajs.logging.Logger.time$(Logger.scala:40)
[error] 	at org.scalajs.sbtplugin.Loggers$SbtLoggerWrapper.time(Loggers.scala:19)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emitOnce(Emitter.scala:174)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emitAvoidGlobalClash(Emitter.scala:148)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emitInternal(Emitter.scala:124)
[error] 	at org.scalajs.linker.backend.emitter.Emitter.emit(Emitter.scala:78)
[error] 	at org.scalajs.linker.backend.BasicLinkerBackend.$anonfun$emit$1(BasicLinkerBackend.scala:57)
[error] 	at org.scalajs.logging.Logger.time(Logger.scala:42)
[error] 	at org.scalajs.logging.Logger.time$(Logger.scala:40)
[error] 	at org.scalajs.sbtplugin.Loggers$SbtLoggerWrapper.time(Loggers.scala:19)
[error] 	at org.scalajs.linker.backend.BasicLinkerBackend.emit(BasicLinkerBackend.scala:57)
[error] 	at org.scalajs.linker.standard.StandardLinkerImpl.$anonfun$link$2(StandardLinkerImpl.scala:47)
[error] 	at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:307)
[error] 	at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
[error] 	at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
[error] 	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
[error] 	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[error] 	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[error] 	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
[error] 	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
[error] (testsJS / Test / fastOptJS) java.util.NoSuchElementException: key not found: LabelName<matchAlts1>
@xuwei-k xuwei-k changed the title Could not build scalaz with dotty 0.27.0-RC1 "NoSuchElementException: key not found: LabelName<matchAlts1>" with dotty 0.27.0-RC1 Aug 31, 2020
@gzm0
Copy link
Contributor

gzm0 commented Aug 31, 2020

Thanks for the report.

What happens if you enable the IR checker (scalaJSLinkerConfig ~= (_.withCheckIR(true)))?

Also, what's the output of sbt> scalajsp example.A?

@sjrd
Copy link
Member

sjrd commented Sep 4, 2020

scalajsp shows

  def main;[Ljava.lang.String;V(args: java.lang.String[]) {
    matchResult1: {
      val x1: any = null;
      matchAlts1: {
        matchAlts2: {
          if (x1.isInstanceOf[java.lang.Integer]) {
            return@matchAlts2 (void 0)
          };
          if (x1.isInstanceOf[java.lang.String]) {
            return@matchAlts2 (void 0)
          };
          return@matchAlts1 (void 0)
        };
        return@matchResult1 (void 0)
      };
      throw new scala.MatchError().<init>;Ljava.lang.Object;V(x1)
    }
  }

which seems correct. The IR checker lets it through.

Deactivating the optimizer with withOptimizer(false) works around the problem. So this is likely an issue in the optimizer.

@sjrd
Copy link
Member

sjrd commented Sep 4, 2020

The following test for LinkerTest reproduces the crash:

  @Test
  def optimizerDoesNotEliminateRequiredLabeledBlockEmittedByDotty_issue4171(): AsyncResult = await {
    /*
    matchResult1: {
      val x1: any = null;
      matchAlts1: {
        matchAlts2: {
          if (x1.isInstanceOf[java.lang.Integer]) {
            return@matchAlts2 (void 0)
          };
          if (x1.isInstanceOf[java.lang.String]) {
            return@matchAlts2 (void 0)
          };
          return@matchAlts1 (void 0)
        };
        return@matchResult1 (void 0)
      };
      throw new scala.MatchError().<init>;Ljava.lang.Object;V(x1)
    }*/

    val matchResult1 = LabelIdent(LabelName("matchResult1"))
    val x1 = LocalIdent("x1")
    val matchAlts1 = LabelIdent(LabelName("matchAlts1"))
    val matchAlts2 = LabelIdent(LabelName("matchAlts2"))

    val classDefs = Seq(
        mainTestClassDef(Block(
          Labeled(matchResult1, NoType, Block(
            VarDef(x1, NON, AnyType, mutable = false, Null()),
            Labeled(matchAlts1, NoType, Block(
              Labeled(matchAlts2, NoType, Block(
                If(IsInstanceOf(VarRef(x1)(AnyType), ClassType(BoxedIntegerClass)), {
                  Return(Undefined(), matchAlts2)
                }, Skip())(NoType),
                If(IsInstanceOf(VarRef(x1)(AnyType), ClassType(BoxedStringClass)), {
                  Return(Undefined(), matchAlts2)
                }, Skip())(NoType),
                Return(Undefined(), matchAlts1)
              )),
              Return(Undefined(), matchResult1)
            )),
            Throw(New("java.lang.Exception", NoArgConstructorName, Nil))
          ))
        ))
    )

    testLink(classDefs, MainTestModuleInitializers)
  }

@sjrd sjrd added the bug Confirmed bug. Needs to be fixed. label Sep 4, 2020
@sjrd sjrd self-assigned this Sep 4, 2020
@sjrd sjrd added this to the v1.2.0 milestone Sep 4, 2020
sjrd added a commit to sjrd/scala-js that referenced this issue Sep 5, 2020
`tryOptimizePatternMatch` tries to identify `Return`s to a given
`Labeled` block, and rearrange the code to get rid of both. It was
too liberal in how it did so, as it recognized *any* `Return` in
the expected positions. We now specifically verify that the
`Return`s are for the particular `Labeled` block that we are
optimizing.
@sjrd sjrd closed this as completed in 580d5aa Sep 6, 2020
sjrd added a commit that referenced this issue Sep 6, 2020
Fix #4171: Fix a missing condition in tryOptimizePatternMatch.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Confirmed bug. Needs to be fixed.
Projects
None yet
Development

No branches or pull requests

3 participants