From 981a6ffeb8b87d696994bd48248e0f8a31ad8747 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 25 Aug 2021 16:19:41 +0300 Subject: [PATCH] Native: RedundantCoercionsCleaner should rewrite nested returns too --- .../konan/lower/RedundantCoercionsCleaner.kt | 3 ++- kotlin-native/backend.native/tests/build.gradle | 4 ++++ .../codegen/inline/redundantCoercionsCleaner.kt | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 kotlin-native/backend.native/tests/codegen/inline/redundantCoercionsCleaner.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/RedundantCoercionsCleaner.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/RedundantCoercionsCleaner.kt index 262bdbdaaed..4b8f8b59dbb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/RedundantCoercionsCleaner.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/RedundantCoercionsCleaner.kt @@ -163,10 +163,11 @@ internal class RedundantCoercionsCleaner(val context: Context) : FileLoweringPas } transformedReturnableBlock.transformChildrenVoid(object: IrElementTransformerVoid() { override fun visitExpression(expression: IrExpression): IrExpression { + expression.transformChildrenVoid() foldedReturnableBlockValues[expression]?.let { return it.getFullExpression(coercion, cast) } - return super.visitExpression(expression) + return expression } override fun visitReturn(expression: IrReturn): IrExpression { diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 22e743ba237..c1d08a84e90 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -3586,6 +3586,10 @@ task inline_coercionToUnit(type: KonanLocalTest) { source = "codegen/inline/coercionToUnit.kt" } +task inline_redundantCoercionsCleaner(type: KonanLocalTest) { + source = "codegen/inline/redundantCoercionsCleaner.kt" +} + task classDeclarationInsideInline(type: KonanLocalTest) { source = "codegen/inline/classDeclarationInsideInline.kt" goldValue = "test1: 1.0\n1\ntest2\n" diff --git a/kotlin-native/backend.native/tests/codegen/inline/redundantCoercionsCleaner.kt b/kotlin-native/backend.native/tests/codegen/inline/redundantCoercionsCleaner.kt new file mode 100644 index 00000000000..a417554aa47 --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/inline/redundantCoercionsCleaner.kt @@ -0,0 +1,17 @@ +package codegen.inline.redundantCoercionsCleaner + +import kotlin.test.* + +inline fun runAndThrow(action: () -> Unit): Nothing { + action() + throw Exception() +} + +inline fun foo(): Int = runAndThrow { + return 1 +} + +@Test fun runTest() { + val result: Any = foo() + assertEquals(1, result) +}