From ff46a63ffa7e83280c4ede51274938097463066e Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Mon, 23 Aug 2021 16:27:14 +0300 Subject: [PATCH] Native: quick fix lazy init boxing issue FileInitializersLowering shouldn't expect codegen to initialize field statically if constant literal is going to be boxed ^KT-48364 --- .../backend/konan/lower/FileInitializersLowering.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt index b4984af54a6..6a3ab9db394 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrConst +import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET import org.jetbrains.kotlin.ir.util.hasAnnotation @@ -113,5 +114,10 @@ internal class FileInitializersLowering(val context: Context) : FileLoweringPass get() = hasNonConstInitializer || needsGCRegistration(context) private val IrField.hasNonConstInitializer: Boolean - get() = initializer?.expression.let { it != null && it !is IrConst<*> } + get() { + val it = initializer?.expression ?: return false + if (it !is IrConst<*>) return true + if (it.kind != IrConstKind.Null && it.type != this.type) return true // Might be boxed, so codegen won't treat it as const. + return false + } }