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

Compiler crash: NoSuchElementException: key not found - Scala 3 #19575

Open
OndrejSpanel opened this issue Jan 31, 2024 · 1 comment
Open

Compiler crash: NoSuchElementException: key not found - Scala 3 #19575

OndrejSpanel opened this issue Jan 31, 2024 · 1 comment

Comments

@OndrejSpanel
Copy link
Member

OndrejSpanel commented Jan 31, 2024

Compiler version

3.4.1-RC1-bin-20240130-7a5cb6e-NIGHTLY

Minimized code

This came up when verifying fix for #19560 (#19567).

The code compiles and works with Scala 2.13.

I am unable to provide a minimized repro at least until Feb 5, having limited computer access until then.

This time there is a least some symbol listed, therefore I might be able to create a proper repro later. There are macros (airframe-surface) involved in the class code, but the error message is a crash, does not provide any pointers to any macros or source locations.

The code contains something like:

import wvlet.airframe.surface._

object X {
  class Cutscene extends JsonValueProvider {
    def getValue= jsonFrom(Surface.of[SomeOtherClass])
  }
}

  case class Template(
    @JsonSchemaProperty(classOf[X.Cutscene]) exec: String
  )

and

import io.circe.Json;

public interface JsonValueProvider {
    String getName();
    Json getValue();
}


public @interface JsonSchemaProperty {
    Class<? extends JsonValueProvider> value();
}

Output (click arrow to expand)

[error] ## Exception when compiling 471 sources to C:\Users\Ondra\IdeaProjects\tempi\target\scala-3.4.1-RC1-bin-20240130-7a5cb6e-NIGHTLY\classes
[error] java.util.NoSuchElementException: key not found: class Cutscene
[error] scala.collection.MapOps.default(Map.scala:274)
[error] scala.collection.MapOps.default$(Map.scala:273)
[error] scala.collection.AbstractMap.default(Map.scala:405)
[error] scala.collection.mutable.HashMap.apply(HashMap.scala:440)
[error] dotty.tools.dotc.transform.LambdaLift$Lifter.liftDef(LambdaLift.scala:207)
[error] dotty.tools.dotc.transform.LambdaLift.transformDefDef(LambdaLift.scala:323)
[error] dotty.tools.dotc.transform.MegaPhase.goDefDef(MegaPhase.scala:1037)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:264)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:448)
[error] dotty.tools.dotc.transform.MegaPhase.loop$2(MegaPhase.scala:467)
[error] dotty.tools.dotc.transform.MegaPhase.transformBlock(MegaPhase.scala:472)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:311)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:323)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:240)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:448)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:315)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(MegaPhase.scala:261)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:264)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:448)
[error] dotty.tools.dotc.transform.MegaPhase.loop$2(MegaPhase.scala:467)
[error] dotty.tools.dotc.transform.MegaPhase.transformBlock(MegaPhase.scala:472)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:311)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:333)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:333)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$2$$anonfun$1(MegaPhase.scala:470)
[error] dotty.tools.dotc.transform.MegaPhase.loop$2(MegaPhase.scala:472)
[error] dotty.tools.dotc.transform.MegaPhase.transformBlock(MegaPhase.scala:472)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:311)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:333)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:359)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.loop$3(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:482)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:292)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(MegaPhase.scala:261)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:264)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:448)
[error] dotty.tools.dotc.transform.MegaPhase.loop$1(MegaPhase.scala:461)
[error] dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:461)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:372)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:268)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:448)
[error] dotty.tools.dotc.transform.MegaPhase.loop$1(MegaPhase.scala:461)
[error] dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:461)
[error] dotty.tools.dotc.transform.MegaPhase.mapPackage$1(MegaPhase.scala:392)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:395)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:450)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:477)
[error] dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:489)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:354)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.immutable.List.foreach(List.scala:333)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:360)
[error] dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:315)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
[error] dotty.tools.dotc.Run.runPhases$1(Run.scala:337)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:350)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:359)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:69)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:359)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:261)
[error] dotty.tools.dotc.Run.compile(Run.scala:246)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
[error] dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:141)
[error] dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:193)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:248)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:183)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:211)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:534)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:534)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:180)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:178)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:464)
[error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:419)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:506)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:406)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:172)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:534)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:488)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:425)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2371)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2321)
[error] sbt.internal.server.BspCompileTask$.$anonfun$compute$1(BspCompileTask.scala:31)
[error] sbt.internal.io.Retry$.apply(Retry.scala:47)
[error] sbt.internal.io.Retry$.apply(Retry.scala:29)
[error] sbt.internal.io.Retry$.apply(Retry.scala:24)
[error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2319)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:69)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:283)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
[error] sbt.Execute.work(Execute.scala:292)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:283)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:65)
[error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
[error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[error] java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[error] java.base/java.lang.Thread.run(Thread.java:829)
[error]
[error] stack trace is suppressed; run 'last Compile / compileIncremental' for the full output
[error] (Compile / compileIncremental) java.util.NoSuchElementException: key not found: class Cutscene
@OndrejSpanel OndrejSpanel added itype:bug itype:crash stat:needs triage Every issue needs to have an "area" and "itype" label labels Jan 31, 2024
@mbovel mbovel added the stat:needs minimization Needs a self contained minimization label Jan 31, 2024
@Gedochao Gedochao added area:transform and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Feb 2, 2024
@OndrejSpanel
Copy link
Member Author

OndrejSpanel commented Feb 5, 2024

Repro at https://github.com/OndrejSpanel/Scala3KeyNotFound

Uses airframe-surface library, crashes both with 3.3.1 and 3.4.1-RC1-bin-20240130-7a5cb6e-NIGHTLY

The code itself is:

import wvlet.airframe.surface.*

class InjectScript(x: Seq[MethodSurface])

class XParams[+T](params: Map[String, T])

object InjectScript {
  trait Params {
    def getParams: XParams[Unit]
  }

  class ScriptX extends InjectScript(Surface.methodsOf[Params])
}

When I add -Xcheck-macros, an assertion is displayed:

java.lang.AssertionError: assertion failed: Tree had an unexpected owner for method $anonfun
Expected: val __s001 (InjectScript$.ScriptX.$$__s001)
|But was: val macro (InjectScript$.ScriptX._$macro)

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