diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt index 361515f4284..a51cd3e17fc 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt @@ -19,12 +19,15 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression +import org.jetbrains.org.objectweb.asm.Type object ArrayGet : IntrinsicMethod() { override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? { val receiver = expression.dispatchReceiver!!.accept(codegen, data).materialized val elementType = AsmUtil.correctElementType(receiver.type) - expression.getValueArgument(0)!!.accept(codegen, data).materialize() + expression.getValueArgument(0)!!.accept(codegen, data) + .coerce(Type.INT_TYPE, codegen.context.irBuiltIns.intType) + .materialize() codegen.mv.aload(elementType) return MaterialValue(codegen, elementType, expression.type) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt index 58c3f5b751f..6b59311a5f0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt @@ -20,13 +20,14 @@ import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.backend.jvm.ir.getArrayElementType import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression +import org.jetbrains.org.objectweb.asm.Type object ArraySet : IntrinsicMethod() { override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? { val receiver = expression.dispatchReceiver!!.accept(codegen, data).materialized val elementType = AsmUtil.correctElementType(receiver.type) val elementIrType = receiver.irType.getArrayElementType(codegen.context.irBuiltIns) - expression.getValueArgument(0)!!.accept(codegen, data).materialize() + expression.getValueArgument(0)!!.accept(codegen, data).coerce(Type.INT_TYPE, codegen.context.irBuiltIns.intType).materialize() expression.getValueArgument(1)!!.accept(codegen, data).coerce(elementType, elementIrType).materialize() codegen.mv.astore(elementType) return codegen.immaterialUnitValue diff --git a/compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt b/compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt new file mode 100644 index 00000000000..6d282bc3b38 --- /dev/null +++ b/compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt @@ -0,0 +1,14 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +fun test(ix: Int?): String { + val arr = arrayOf("fail 1") + + if (ix != null) { + arr[ix] = "OK" + return arr[ix] + } + return "fail 2" +} + +fun box() = test(0) + diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index ec797069fe3..b384c7608c6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -18693,6 +18693,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/primitiveTypes/nullAsNullableIntIsNull.kt"); } + @TestMetadata("nullableAsIndex.kt") + public void testNullableAsIndex() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt"); + } + @TestMetadata("nullableCharBoolean.kt") public void testNullableCharBoolean() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/nullableCharBoolean.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index d176f36a7ff..a4e1794a3fb 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -18693,6 +18693,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/primitiveTypes/nullAsNullableIntIsNull.kt"); } + @TestMetadata("nullableAsIndex.kt") + public void testNullableAsIndex() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt"); + } + @TestMetadata("nullableCharBoolean.kt") public void testNullableCharBoolean() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/nullableCharBoolean.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index c9bae2fcaf6..e0dfebc8851 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -17177,6 +17177,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/primitiveTypes/nullAsNullableIntIsNull.kt"); } + @TestMetadata("nullableAsIndex.kt") + public void testNullableAsIndex() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt"); + } + @TestMetadata("nullableCharBoolean.kt") public void testNullableCharBoolean() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/nullableCharBoolean.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 0b2c5cb83f3..dc63f827001 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -17177,6 +17177,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/primitiveTypes/nullAsNullableIntIsNull.kt"); } + @TestMetadata("nullableAsIndex.kt") + public void testNullableAsIndex() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt"); + } + @TestMetadata("nullableCharBoolean.kt") public void testNullableCharBoolean() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/nullableCharBoolean.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index d2cbabfbf1b..745f98153ce 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -14413,6 +14413,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/primitiveTypes/nullAsNullableIntIsNull.kt"); } + @TestMetadata("nullableAsIndex.kt") + public void testNullableAsIndex() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt"); + } + @TestMetadata("nullableCharBoolean.kt") public void testNullableCharBoolean() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/nullableCharBoolean.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 66575d9f10a..7dfaf052892 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -15593,6 +15593,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/primitiveTypes/nullAsNullableIntIsNull.kt"); } + @TestMetadata("nullableAsIndex.kt") + public void testNullableAsIndex() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/nullableAsIndex.kt"); + } + @TestMetadata("nullableCharBoolean.kt") public void testNullableCharBoolean() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/nullableCharBoolean.kt");