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 with (f:AnyRef => AnyRef) #19962

Closed
jarno-r opened this issue Mar 16, 2024 · 4 comments · Fixed by #19966
Closed

Compiler crash with (f:AnyRef => AnyRef) #19962

jarno-r opened this issue Mar 16, 2024 · 4 comments · Fixed by #19966

Comments

@jarno-r
Copy link

jarno-r commented Mar 16, 2024

Compiler version

3.3.3 and 3.4.0
Works fine in Scala 2.

Minimized code

val selfie : (AnyRef => AnyRef) => AnyRef = (f:AnyRef => AnyRef) => f(f)

Output (click arrow to expand)

       during phase: MegaPhase{lambdaLift, elimStaticThis, countOuterAccesses}
                mode: Mode(ImplicitsEnabled)
     library version: version 2.13.12
    compiler version: version 3.3.3

[error] ## Exception when compiling 3 sources to /home/jarno/projects/higher-order-logic-scala/target/scala-3.3.3/classes
[error] java.lang.IllegalArgumentException: Could not find proxy for f: Function1 in [parameter f, method $anonfun, value selfie, method basic, package object Intuitionistic$package, package logic, package <root>], encl = method basic, owners = method basic, package object Intuitionistic$package, package logic, package <root>; enclosures = method basic, package object Intuitionistic$package, package logic, package <root>
[error] dotty.tools.dotc.transform.LambdaLift$Lifter.searchIn$1(LambdaLift.scala:135)
[error] dotty.tools.dotc.transform.LambdaLift$Lifter.proxy(LambdaLift.scala:148)
[error] dotty.tools.dotc.transform.LambdaLift$Lifter.proxyRef(LambdaLift.scala:166)
[error] dotty.tools.dotc.transform.LambdaLift.transformIdent(LambdaLift.scala:285)
[error] dotty.tools.dotc.transform.MegaPhase.goIdent(MegaPhase.scala:609)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:228)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:440)
[error] dotty.tools.dotc.transform.MegaPhase.mapValDef$1(MegaPhase.scala:239)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:244)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:440)
[error] dotty.tools.dotc.transform.MegaPhase.loop$2(MegaPhase.scala:459)
[error] dotty.tools.dotc.transform.MegaPhase.transformBlock(MegaPhase.scala:464)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:303)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:442)
[error] dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(MegaPhase.scala:253)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:256)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:440)
[error] dotty.tools.dotc.transform.MegaPhase.loop$1(MegaPhase.scala:453)
[error] dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:453)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:364)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:442)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:260)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:440)
[error] dotty.tools.dotc.transform.MegaPhase.loop$1(MegaPhase.scala:453)
[error] dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:453)
[error] dotty.tools.dotc.transform.MegaPhase.mapPackage$1(MegaPhase.scala:384)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:387)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:442)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:469)
[error] dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:481)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:327)
[error] scala.collection.immutable.List.map(List.scala:250)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:331)
[error] dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:246)
[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:262)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:270)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:279)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:71)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:279)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:194)
[error] dotty.tools.dotc.Run.compile(Run.scala:179)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
[error] dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:136)
[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:1130)
[error] java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
[error] java.base/java.lang.Thread.run(Thread.java:831)
[error]            
[error] stack trace is suppressed; run last Compile / compileIncremental for the full output
[error] (Compile / compileIncremental) java.lang.IllegalArgumentException: Could not find proxy for f: Function1 in [parameter f, method $anonfun, value selfie, method basic, package object Intuitionistic$package, package logic, package <root>], encl = method basic, owners = method basic, package object Intuitionistic$package, package logic, package <root>; enclosures = method basic, package object Intuitionistic$package, package logic, package <root>
[error] Total time: 1 s, completed Mar 16, 2024, 7:21:36 PM
@jarno-r jarno-r added itype:bug itype:crash stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 16, 2024
@nicolasstucki
Copy link
Contributor

Minimization

def selfie: Any = (f: Any => Any) => f(f)

@nicolasstucki
Copy link
Contributor

Something goes wrong in MegaPhase{elimErasedValueType, pureStats, vcElideAllocations, etaReduce, arrayApply, elimPolyFunction, tailrec, completeJavaEnums, mixin, lazyVals, memoize, nonLocalReturns, capturedVars}

[[syntax trees at end of                   erasure]] // t/Test.scala
package <empty> {
  final lazy module val Test$package: Test$package = new Test$package()
  @SourceFile("t/Test.scala") final module class Test$package() extends Object()
     {
    private def writeReplace(): Object =
      new scala.runtime.ModuleSerializationProxy(classOf[Test$package])
    def fun(): Object =
      {
        def $anonfun(f: Function1): Object = f.apply(f)
        closure($anonfun)
      }
  }
}

[[syntax trees at end of MegaPhase{elimErasedValueType, pureStats, vcElideAllocations, etaReduce, arrayApply, elimPolyFunction, tailrec, completeJavaEnums, mixin, lazyVals, memoize, nonLocalReturns, capturedVars}]] // t/Test.scala
package <empty> {
  final lazy module val Test$package: Test$package = new Test$package()
  @SourceFile("t/Test.scala") final module class Test$package() extends Object {
    super()
    private def writeReplace(): Object =
      new scala.runtime.ModuleSerializationProxy(classOf[Test$package])
    def fun(): Object = f
  }
}

@nicolasstucki
Copy link
Contributor

nicolasstucki commented Mar 18, 2024

The issue is in etaReduce.

By splitting the mini phases we get
[[syntax trees at end of                   erasure]] // t/Test.scala
package <empty> {
  final lazy module val Test$package: Test$package = new Test$package()
  @SourceFile("t/Test.scala") final module class Test$package() extends Object()
     {
    private def writeReplace(): Object =
      new scala.runtime.ModuleSerializationProxy(classOf[Test$package])
    def fun(): Object =
      {
        def $anonfun(f: Function1): Object = f.apply(f)
        closure($anonfun)
      }
  }
}

[[syntax trees at end of       elimErasedValueType]] // t/Test.scala: unchanged since erasure
[[syntax trees at end of                 pureStats]] // t/Test.scala: unchanged since erasure
[[syntax trees at end of        vcElideAllocations]] // t/Test.scala: unchanged since erasure
[[syntax trees at end of                 etaReduce]] // t/Test.scala
package <empty> {
  final lazy module val Test$package: Test$package = new Test$package()
  @SourceFile("t/Test.scala") final module class Test$package() extends Object()
     {
    private def writeReplace(): Object =
      new scala.runtime.ModuleSerializationProxy(classOf[Test$package])
    def fun(): Object = f
  }
}

@nicolasstucki nicolasstucki added area:transform and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 18, 2024
@nicolasstucki nicolasstucki self-assigned this Mar 18, 2024
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Mar 18, 2024
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Mar 18, 2024
@nicolasstucki
Copy link
Contributor

In general, this fails on any

(x1: T1, ..., xi: Ti,  ..., xn: Tn) => xi.apply(x1, ..., xn) 

where

Ti =:= (T1, ..., Ti-1, U, Ti+1, ... Tn) => R

and

Ti <: U

This seems to be an unlikely corner case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants