diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt index 7b70e9a056f..71657ced2b7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.parentClassOrNull @@ -95,11 +95,11 @@ class Fir2IrConversionScope { return result } - fun returnTarget(expression: FirReturnExpression): IrFunction { + fun returnTarget(expression: FirReturnExpression, declarationStorage: Fir2IrDeclarationStorage): IrFunction { val firTarget = expression.target.labeledElement + val irTarget = (firTarget as? FirFunction)?.let { declarationStorage.getCachedIrFunction(it) } for (potentialTarget in functionStack.asReversed()) { - // TODO: remove comparison by name - if (potentialTarget.name == (firTarget as? FirSimpleFunction)?.name) { + if (potentialTarget == irTarget) { return potentialTarget } } 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 192f8896ffa..1ab8477f3d7 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 @@ -293,7 +293,7 @@ class Fir2IrVisitor( // ================================================================================== override fun visitReturnExpression(returnExpression: FirReturnExpression, data: Any?): IrElement { - val irTarget = conversionScope.returnTarget(returnExpression) + val irTarget = conversionScope.returnTarget(returnExpression, declarationStorage) return returnExpression.convertWithOffsets { startOffset, endOffset -> val result = returnExpression.result IrReturnImpl( diff --git a/compiler/testData/codegen/box/coroutines/inlineSuspendLambdaNonLocalReturn.kt b/compiler/testData/codegen/box/coroutines/inlineSuspendLambdaNonLocalReturn.kt index 57f104a547c..ab6dde1150a 100644 --- a/compiler/testData/codegen/box/coroutines/inlineSuspendLambdaNonLocalReturn.kt +++ b/compiler/testData/codegen/box/coroutines/inlineSuspendLambdaNonLocalReturn.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambda.kt b/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambda.kt index cd1d8e9425b..d393f5ceea5 100644 --- a/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambda.kt +++ b/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambda.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // COMMON_COROUTINES_TEST // WITH_COROUTINES diff --git a/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambdaDeep.kt b/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambdaDeep.kt index 5777277f77e..af5fc73a96a 100644 --- a/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambdaDeep.kt +++ b/compiler/testData/codegen/box/coroutines/nonLocalReturnFromInlineLambdaDeep.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // COMMON_COROUTINES_TEST // WITH_COROUTINES diff --git a/compiler/testData/codegen/box/coroutines/unitTypeReturn/coroutineNonLocalReturn.kt b/compiler/testData/codegen/box/coroutines/unitTypeReturn/coroutineNonLocalReturn.kt index 533c22f6e0b..f73be96daf0 100644 --- a/compiler/testData/codegen/box/coroutines/unitTypeReturn/coroutineNonLocalReturn.kt +++ b/compiler/testData/codegen/box/coroutines/unitTypeReturn/coroutineNonLocalReturn.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // WITH_COROUTINES // COMMON_COROUTINES_TEST diff --git a/compiler/testData/codegen/box/nonLocalReturns/returnInsideTwoLambdas.kt b/compiler/testData/codegen/box/nonLocalReturns/returnInsideTwoLambdas.kt index 92e8535c552..4f0dc889db3 100644 --- a/compiler/testData/codegen/box/nonLocalReturns/returnInsideTwoLambdas.kt +++ b/compiler/testData/codegen/box/nonLocalReturns/returnInsideTwoLambdas.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR fun outer(command: () -> T) : T = command() inline fun inner(action: () -> K): K = action() diff --git a/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt b/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt index b7efcd27aa8..40ce2bbb3e8 100644 --- a/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt +++ b/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt @@ -39,7 +39,7 @@ FILE fqName: fileName:/nonLocalReturn.kt block: FUN_EXPR type=kotlin.Function0 origin=LAMBDA FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Nothing BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (): kotlin.Nothing declared in .test3.' + RETURN type=kotlin.Nothing from='local final fun (): kotlin.Unit declared in .test3' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit FUN name:testLrmFoo1 visibility:public modality:FINAL <> (ints:kotlin.collections.List) returnType:kotlin.Unit VALUE_PARAMETER name:ints index:0 type:kotlin.collections.List