diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanSharedVariablesManager.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanSharedVariablesManager.kt index 6b60beb2180..6f5a0b47427 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanSharedVariablesManager.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanSharedVariablesManager.kt @@ -8,11 +8,11 @@ package org.jetbrains.kotlin.backend.konan.descriptors import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager import org.jetbrains.kotlin.backend.konan.KonanBackendContext -import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl +import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.IrSetVariable import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl @@ -20,9 +20,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.types.typeWith import org.jetbrains.kotlin.ir.util.constructors -import org.jetbrains.kotlin.types.* internal class KonanSharedVariablesManager(val context: KonanBackendContext) : SharedVariablesManager { @@ -32,18 +32,7 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S private val elementProperty = refClass.owner.declarations.filterIsInstance().single() - private fun refType(elementType: KotlinType): KotlinType { - return refClass.descriptor.defaultType.replace(listOf(TypeProjectionImpl(elementType))) - } - override fun declareSharedVariable(originalDeclaration: IrVariable): IrVariable { - val variableDescriptor = originalDeclaration.descriptor - val sharedVariableDescriptor = LocalVariableDescriptor( - variableDescriptor.containingDeclaration, variableDescriptor.annotations, variableDescriptor.name, - refType(variableDescriptor.type), - false, false, variableDescriptor.source - ) - val valueType = originalDeclaration.type val refConstructorCall = IrConstructorCallImpl.fromSymbolOwner( @@ -54,11 +43,19 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S putTypeArgument(0, valueType) } - return IrVariableImpl( - originalDeclaration.startOffset, originalDeclaration.endOffset, originalDeclaration.origin, - sharedVariableDescriptor, refConstructorCall.type - ).apply { - initializer = refConstructorCall + return with(originalDeclaration) { + WrappedVariableDescriptor().let { + IrVariableImpl( + startOffset, endOffset, origin, + IrVariableSymbolImpl(it), name, refConstructorCall.type, + isVar = false, + isConst = false, + isLateinit = false + ).apply { + it.bind(this) + initializer = refConstructorCall + } + } } } diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index fc6fc8410cb..042ef09296f 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -1301,6 +1301,11 @@ linkTest("initializers_linkTest2") { lib = "codegen/initializers/linkTest2_lib.kt" } +linkTest("initializers_sharedVarInInitBlock") { + source = "codegen/initializers/sharedVarInInitBlock_main.kt" + lib = "codegen/initializers/sharedVarInInitBlock_lib.kt" +} + task arithmetic_basic(type: KonanLocalTest) { source = "codegen/arithmetic/basic.kt" } diff --git a/backend.native/tests/codegen/initializers/sharedVarInInitBlock_lib.kt b/backend.native/tests/codegen/initializers/sharedVarInInitBlock_lib.kt new file mode 100644 index 00000000000..641e7def76b --- /dev/null +++ b/backend.native/tests/codegen/initializers/sharedVarInInitBlock_lib.kt @@ -0,0 +1,13 @@ +class A { + val x: Int + + init { + var y = 10 + + fun foo() { y = 42 } + + foo() + + x = y + } +} \ No newline at end of file diff --git a/backend.native/tests/codegen/initializers/sharedVarInInitBlock_main.kt b/backend.native/tests/codegen/initializers/sharedVarInInitBlock_main.kt new file mode 100644 index 00000000000..8a1b4f274f2 --- /dev/null +++ b/backend.native/tests/codegen/initializers/sharedVarInInitBlock_main.kt @@ -0,0 +1,3 @@ +import kotlin.test.* + +fun main() = assertEquals(42, (A().x)) \ No newline at end of file