Closed jarno-r closed 7 months ago
def selfie: Any = (f: Any => Any) => f(f)
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
}
}
The issue is in etaReduce
.
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.
Compiler version
3.3.3 and 3.4.0 Works fine in Scala 2.
Minimized code
Output (click arrow to expand)