FIR2IR: insert implicit cast of receiver to Any for interface Any calls
This commit is contained in:
+18
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.backend.generators
|
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.FirFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
import org.jetbrains.kotlin.fir.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -731,7 +732,23 @@ class CallAndReferenceGenerator(
|
|||||||
symbol.owner as? IrFunction
|
symbol.owner as? IrFunction
|
||||||
?: (symbol.owner as? IrProperty)?.getter
|
?: (symbol.owner as? IrProperty)?.getter
|
||||||
if (ownerFunction?.dispatchReceiverParameter != null) {
|
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) {
|
if (ownerFunction?.extensionReceiverParameter != null) {
|
||||||
extensionReceiver = qualifiedAccess.findIrExtensionReceiver(explicitReceiverExpression)?.let {
|
extensionReceiver = qualifiedAccess.findIrExtensionReceiver(explicitReceiverExpression)?.let {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
val x: () -> Unit = {}
|
val x: () -> Unit = {}
|
||||||
val y = x.hashCode()
|
val y = x.hashCode()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user