diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 49078978c9c..067ab1eaa6c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -128,6 +128,18 @@ class Fir2IrVisitor( return this } + private fun lastDispatchReceiverParameter(): IrValueParameter? { + val dispatchReceiver = functionStack.lastOrNull()?.dispatchReceiverParameter + return if (dispatchReceiver != null) { + // Use the dispatch receiver of the containing function + dispatchReceiver + } else { + val lastClassSymbol = classStack.lastOrNull()?.symbol + // Use the dispatch receiver of the containing class + lastClassSymbol?.owner?.thisReceiver + } + } + private val subjectVariableStack = mutableListOf() private fun IrVariable?.withSubject(f: () -> T): T { @@ -708,9 +720,8 @@ class Fir2IrVisitor( return typeRef.convertWithOffsets { startOffset, endOffset -> if (calleeReference is FirSuperReference) { if (typeRef !is FirComposedSuperTypeRef) { - val dispatchReceiver = functionStack.lastOrNull()?.dispatchReceiverParameter + val dispatchReceiver = lastDispatchReceiverParameter() if (dispatchReceiver != null) { - // Use the dispatch receiver of the containing function return@convertWithOffsets IrGetValueImpl(startOffset, endOffset, dispatchReceiver.type, dispatchReceiver.symbol) } } @@ -912,9 +923,8 @@ class Fir2IrVisitor( } } - val dispatchReceiver = this.functionStack.lastOrNull()?.dispatchReceiverParameter + val dispatchReceiver = lastDispatchReceiverParameter() if (dispatchReceiver != null) { - // Use the dispatch receiver of the containing function return thisReceiverExpression.convertWithOffsets { startOffset, endOffset -> IrGetValueImpl(startOffset, endOffset, dispatchReceiver.type, dispatchReceiver.symbol) } diff --git a/compiler/testData/codegen/box/classes/kt2566_2.kt b/compiler/testData/codegen/box/classes/kt2566_2.kt index 5590c5ecf74..b119af85615 100644 --- a/compiler/testData/codegen/box/classes/kt2566_2.kt +++ b/compiler/testData/codegen/box/classes/kt2566_2.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR open class A { open val foo: String = "OK" } diff --git a/compiler/testData/codegen/box/mangling/internalOverrideSuperCall.kt b/compiler/testData/codegen/box/mangling/internalOverrideSuperCall.kt index e5530d5d9e3..64424c1dd80 100644 --- a/compiler/testData/codegen/box/mangling/internalOverrideSuperCall.kt +++ b/compiler/testData/codegen/box/mangling/internalOverrideSuperCall.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR open class A { internal open val field = "F" diff --git a/compiler/testData/codegen/box/mangling/publicOverrideSuperCall.kt b/compiler/testData/codegen/box/mangling/publicOverrideSuperCall.kt index 40bcb6b6077..422f510101e 100644 --- a/compiler/testData/codegen/box/mangling/publicOverrideSuperCall.kt +++ b/compiler/testData/codegen/box/mangling/publicOverrideSuperCall.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR open class A { internal open val field = "F"