[K/N] Better handling of nested returns in RedundantCoercionsCleaner.kt
^KT-49356
This commit is contained in:
+13
-1
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.DECLARATION_ORIGIN_INLINE_CLASS_SPECIA
|
|||||||
import org.jetbrains.kotlin.backend.konan.getInlinedClassNative
|
import org.jetbrains.kotlin.backend.konan.getInlinedClassNative
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.isBoxOrUnboxCall
|
import org.jetbrains.kotlin.backend.konan.ir.isBoxOrUnboxCall
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
@@ -161,6 +162,16 @@ internal class RedundantCoercionsCleaner(val context: Context) : FileLoweringPas
|
|||||||
statements = statements,
|
statements = statements,
|
||||||
inlineFunctionSymbol = inlineFunctionSymbol)
|
inlineFunctionSymbol = inlineFunctionSymbol)
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Visitor below requires being very careful when changing it.
|
||||||
|
* It heavily relies on implementation of fold and getFullExpression functions,
|
||||||
|
* in particular it uses fact, that parts of foldedReturnableBlockValues will be replaced
|
||||||
|
* simultaneously with IR.
|
||||||
|
*
|
||||||
|
* For example, this requires replacing ReturnableBlock symbols in separate pass,
|
||||||
|
* because it needs new return nodes to be created, which breaks changing it's content in
|
||||||
|
* foldedReturnableBlockValues.
|
||||||
|
*/
|
||||||
transformedReturnableBlock.transformChildrenVoid(object: IrElementTransformerVoid() {
|
transformedReturnableBlock.transformChildrenVoid(object: IrElementTransformerVoid() {
|
||||||
override fun visitExpression(expression: IrExpression): IrExpression {
|
override fun visitExpression(expression: IrExpression): IrExpression {
|
||||||
expression.transformChildrenVoid()
|
expression.transformChildrenVoid()
|
||||||
@@ -169,7 +180,8 @@ internal class RedundantCoercionsCleaner(val context: Context) : FileLoweringPas
|
|||||||
}
|
}
|
||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
transformedReturnableBlock.transformChildrenVoid(object: IrElementTransformerVoid() {
|
||||||
override fun visitReturn(expression: IrReturn): IrExpression {
|
override fun visitReturn(expression: IrReturn): IrExpression {
|
||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
return if (expression.returnTargetSymbol != oldSymbol)
|
return if (expression.returnTargetSymbol != oldSymbol)
|
||||||
|
|||||||
@@ -33,3 +33,17 @@ inline fun foo2(): Int {
|
|||||||
@Test fun runTest2() {
|
@Test fun runTest2() {
|
||||||
assertEquals(2, bar2())
|
assertEquals(2, bar2())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test for https://youtrack.jetbrains.com/issue/KT-49356.
|
||||||
|
|
||||||
|
inline fun foo3(): Int {
|
||||||
|
return (return 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar3(): Any {
|
||||||
|
return foo3()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test fun runTest3() {
|
||||||
|
assertEquals(3, bar3())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user