From 88b80e0ed234fc12a291f9243bcae7b82c40a837 Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Tue, 6 Feb 2024 18:21:19 +0100 Subject: [PATCH] [FIR2IR] Add Unit coercion for non-last expressions in try/catch blocks ^KT-61088 Fixed --- .../kotlin/fir/backend/Fir2IrImplicitCastInserter.kt | 9 +++++++++ .../codegen/box/polymorphicSignature/insideTry.kt | 7 ++++++- .../box/polymorphicSignature/varargOfObjects_after.kt | 2 -- compiler/testData/ir/irText/expressions/tryCatch.ir.txt | 6 ++++++ compiler/testData/ir/irText/expressions/tryCatch.kt | 3 +++ compiler/testData/ir/irText/expressions/tryCatch.kt.txt | 3 +++ 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt index e6ba56c2c10..faf7cb56265 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt @@ -175,6 +175,15 @@ class Fir2IrImplicitCastInserter( override fun visitTryExpression(tryExpression: FirTryExpression, data: IrElement): IrElement { val irTry = data as IrTry + + (irTry.tryResult as? IrContainerExpression)?.let { + irTry.tryResult = it.insertImplicitCasts() + } + for (catch in irTry.catches) { + (catch.result as? IrContainerExpression)?.let { + catch.result = it.insertImplicitCasts() + } + } (irTry.finallyExpression as? IrContainerExpression)?.let { irTry.finallyExpression = it.insertImplicitCasts(coerceLastExpressionToUnit = true) } diff --git a/compiler/testData/codegen/box/polymorphicSignature/insideTry.kt b/compiler/testData/codegen/box/polymorphicSignature/insideTry.kt index 7a76497eedd..eaa0244d49b 100644 --- a/compiler/testData/codegen/box/polymorphicSignature/insideTry.kt +++ b/compiler/testData/codegen/box/polymorphicSignature/insideTry.kt @@ -6,13 +6,18 @@ import java.lang.invoke.MethodHandles import java.lang.invoke.MethodType object O { - fun main() {} + var counter = 0 + fun main() { + counter += 1 + } } fun box(): String { try { val mh = MethodHandles.lookup().findVirtual(O::class.java, "main", MethodType.methodType(Void.TYPE)) mh.invokeExact(O) + mh.invokeExact(O) } finally {} + if (O.counter != 2) return "Fail: counter == ${O.counter}" return "OK" } diff --git a/compiler/testData/codegen/box/polymorphicSignature/varargOfObjects_after.kt b/compiler/testData/codegen/box/polymorphicSignature/varargOfObjects_after.kt index 89bdba7a0b1..106a1de02e7 100644 --- a/compiler/testData/codegen/box/polymorphicSignature/varargOfObjects_after.kt +++ b/compiler/testData/codegen/box/polymorphicSignature/varargOfObjects_after.kt @@ -1,6 +1,4 @@ // !LANGUAGE: +PolymorphicSignature -// IGNORE_BACKEND_K2: JVM_IR, JS_IR -// FIR status: Fail 9 // TARGET_BACKEND: JVM // FULL_JDK // SKIP_JDK6 diff --git a/compiler/testData/ir/irText/expressions/tryCatch.ir.txt b/compiler/testData/ir/irText/expressions/tryCatch.ir.txt index d1954c86a40..08031f6899f 100644 --- a/compiler/testData/ir/irText/expressions/tryCatch.ir.txt +++ b/compiler/testData/ir/irText/expressions/tryCatch.ir.txt @@ -18,13 +18,19 @@ FILE fqName: fileName:/tryCatch.kt TRY type=kotlin.Int try: BLOCK type=kotlin.Int origin=null CALL 'public final fun println (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CONST Int type=kotlin.Int value=100 CONST Int type=kotlin.Int value=42 CATCH parameter=val e: kotlin.Throwable declared in .test2 VAR CATCH_PARAMETER name:e type:kotlin.Throwable [val] BLOCK type=kotlin.Int origin=null CALL 'public final fun println (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CONST Int type=kotlin.Int value=101 CONST Int type=kotlin.Int value=24 finally: BLOCK type=kotlin.Unit origin=null CALL 'public final fun println (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CONST Int type=kotlin.Int value=102 TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CONST Int type=kotlin.Int value=555 diff --git a/compiler/testData/ir/irText/expressions/tryCatch.kt b/compiler/testData/ir/irText/expressions/tryCatch.kt index 4e25aebd535..4c5b3fa74d6 100644 --- a/compiler/testData/ir/irText/expressions/tryCatch.kt +++ b/compiler/testData/ir/irText/expressions/tryCatch.kt @@ -17,14 +17,17 @@ fun test1() { fun test2(): Int { return try { println() + 100 42 } catch (e: Throwable) { println() + 101 24 } finally { println() + 102 555 } } diff --git a/compiler/testData/ir/irText/expressions/tryCatch.kt.txt b/compiler/testData/ir/irText/expressions/tryCatch.kt.txt index 2ad9b10ded1..10d3fa033d1 100644 --- a/compiler/testData/ir/irText/expressions/tryCatch.kt.txt +++ b/compiler/testData/ir/irText/expressions/tryCatch.kt.txt @@ -16,14 +16,17 @@ fun test1() { fun test2(): Int { return try { // BLOCK println() + 100 /*~> Unit */ 42 } catch (e: Throwable){ // BLOCK println() + 101 /*~> Unit */ 24 } finally { // BLOCK println() + 102 /*~> Unit */ 555 /*~> Unit */ } }