diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index a3ec4aa2be8..c326d70c176 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -1337,7 +1337,8 @@ internal class FunctionGenerationContext(val function: LLVMValueRef, fun getBuilder(): LLVMBuilderRef { if (isAfterTerminator) { - positionAtEnd(basicBlock("unreachable", null)) + val position = position() + positionAtEnd(basicBlock("unreachable", position?.start, position?.end)) } return builder diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 6f05f91f133..b19e50bd617 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2917,6 +2917,14 @@ task unit4(type: KonanLocalTest) { source = "codegen/basics/unit4.kt" } +task kt42000_1(type: KonanLocalTest) { + source = "codegen/basics/k42000_1.kt" +} + +task kt42000_2(type: KonanLocalTest) { + source = "codegen/basics/k42000_2.kt" +} + task inline0(type: KonanLocalTest) { goldValue = "84\n" source = "codegen/inline/inline0.kt" diff --git a/backend.native/tests/codegen/basics/k42000_1.kt b/backend.native/tests/codegen/basics/k42000_1.kt new file mode 100644 index 00000000000..7f18c7fd110 --- /dev/null +++ b/backend.native/tests/codegen/basics/k42000_1.kt @@ -0,0 +1,37 @@ +package codegen.basics.k42000_1 + +import kotlin.test.* + +@Test +fun runTest() { + assertTrue(Reproducer().repro() > 0) +} + +// Based on https://youtrack.jetbrains.com/issue/KT-42000#focus=Comments-27-4404934.0-0 + +val Int.isEven get() = this % 2 == 0 + +inline operator fun T.plus(other: T): T = when (T::class) { + Double::class -> (this as Double) + (other as Double) + Int::class -> (this as Int) + (other as Int) + Long::class -> (this as Long) + (other as Long) + else -> TODO() +} as T + +inline fun Collection.median(): Double { + val sorted = this.sortedBy { + it.toDouble() + } + + return if (size.isEven || size == 1) { + sorted[size / 2] + } else { + sorted[size / 2] + sorted[size / 2 + 1] + }.toDouble() +} + +class Reproducer { + private var someListOfLongs = mutableListOf(1L) + + fun repro() = someListOfLongs.median() +} diff --git a/backend.native/tests/codegen/basics/k42000_2.kt b/backend.native/tests/codegen/basics/k42000_2.kt new file mode 100644 index 00000000000..fe264739fe7 --- /dev/null +++ b/backend.native/tests/codegen/basics/k42000_2.kt @@ -0,0 +1,14 @@ +package codegen.basics.k42000_2 + +import kotlin.test.* + +// https://youtrack.jetbrains.com/issue/KT-42000 + +@Test +fun runTest() { + assertFailsWith { + when (1) { + else -> throw Error() + } as String + } +}