FIR2IR: insert implicit cast of receiver to Any for interface Any calls

This commit is contained in:
Mikhail Glukhikh
2021-02-05 18:32:17 +03:00
parent 1c210c2386
commit 2cbdad0bb1
2 changed files with 18 additions and 2 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
@@ -731,7 +732,23 @@ class CallAndReferenceGenerator(
symbol.owner as? IrFunction
?: (symbol.owner as? IrProperty)?.getter
if (ownerFunction?.dispatchReceiverParameter != null) {
dispatchReceiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression)
val baseDispatchReceiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression)
dispatchReceiver =
if (!ownerFunction.isMethodOfAny() || baseDispatchReceiver?.type?.classOrNull?.owner?.isInterface != true) {
baseDispatchReceiver
} else {
// NB: for FE 1.0, this type cast is added by InterfaceObjectCallsLowering
// However, it doesn't work for FIR due to different f/o structure
// (FIR calls Any method directly, but FE 1.0 calls its interface f/o instead)
IrTypeOperatorCallImpl(
baseDispatchReceiver.startOffset,
baseDispatchReceiver.endOffset,
irBuiltIns.anyType,
IrTypeOperator.IMPLICIT_CAST,
irBuiltIns.anyType,
baseDispatchReceiver
)
}
}
if (ownerFunction?.extensionReceiverParameter != null) {
extensionReceiver = qualifiedAccess.findIrExtensionReceiver(explicitReceiverExpression)?.let {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
val x: () -> Unit = {}
val y = x.hashCode()