diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt index c5751b0e0c9..44adb1e613d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt @@ -212,7 +212,7 @@ fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.moda internal fun FunctionDescriptor.hasValueTypeAt(index: Int): Boolean { when (index) { - 0 -> return !isSuspend && returnType.let { it != null && it.isValueType() } + 0 -> return !isSuspend && returnType.let { it != null && (it.isValueType() || it.isUnit()) } 1 -> return extensionReceiverParameter.let { it != null && it.type.isValueType() } else -> return this.valueParameters[index - 2].type.isValueType() } @@ -220,7 +220,7 @@ internal fun FunctionDescriptor.hasValueTypeAt(index: Int): Boolean { internal fun FunctionDescriptor.hasReferenceAt(index: Int): Boolean { when (index) { - 0 -> return isSuspend || returnType.let { it != null && !it.isValueType() } + 0 -> return isSuspend || returnType.let { it != null && !it.isValueType() && !it.isUnit() } 1 -> return extensionReceiverParameter.let { it != null && !it.type.isValueType() } else -> return !this.valueParameters[index - 2].type.isValueType() } @@ -241,13 +241,12 @@ internal enum class BridgeDirection { TO_VALUE_TYPE } -private fun FunctionDescriptor.bridgeDirectionToAt(target: FunctionDescriptor, index: Int): BridgeDirection { - when { - hasValueTypeAt(index) && target.hasReferenceAt(index) -> return BridgeDirection.FROM_VALUE_TYPE - hasReferenceAt(index) && target.hasValueTypeAt(index) -> return BridgeDirection.TO_VALUE_TYPE - else -> return BridgeDirection.NOT_NEEDED - } -} +private fun FunctionDescriptor.bridgeDirectionToAt(target: FunctionDescriptor, index: Int) + = when { + hasValueTypeAt(index) && target.hasReferenceAt(index) -> BridgeDirection.FROM_VALUE_TYPE + hasReferenceAt(index) && target.hasValueTypeAt(index) -> BridgeDirection.TO_VALUE_TYPE + else -> BridgeDirection.NOT_NEEDED + } internal class BridgeDirections(val array: Array) { constructor(parametersCount: Int): this(Array(parametersCount + 2, { BridgeDirection.NOT_NEEDED })) @@ -259,8 +258,8 @@ internal class BridgeDirections(val array: Array) { array.forEach { result.append(when (it) { BridgeDirection.FROM_VALUE_TYPE -> 'U' // unbox - BridgeDirection.TO_VALUE_TYPE -> 'B' // box - BridgeDirection.NOT_NEEDED -> 'N' // none + BridgeDirection.TO_VALUE_TYPE -> 'B' // box + BridgeDirection.NOT_NEEDED -> 'N' // none }) } return result.toString()