diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 2901e7ff1ac..740b350155d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -15,6 +15,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.PrimitiveType; +import org.jetbrains.kotlin.builtins.UnsignedTypes; import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.intrinsics.HashCode; @@ -113,8 +114,27 @@ public class AsmUtil { @NotNull public static Type boxType(@NotNull Type type) { + Type boxedType = boxPrimitiveType(type); + return boxedType != null ? boxedType : type; + } + + @NotNull + public static Type boxType(@NotNull Type type, @NotNull KotlinType kotlinType, @NotNull GenerationState state) { + Type boxedPrimitiveType = boxPrimitiveType(type); + if (boxedPrimitiveType != null) return boxedPrimitiveType; + + if (InlineClassesUtilsKt.isInlineClassType(kotlinType)) { + return state.getTypeMapper().mapTypeAsDeclaration(kotlinType); + } + else { + return type; + } + } + + @Nullable + private static Type boxPrimitiveType(@NotNull Type type) { JvmPrimitiveType jvmPrimitiveType = primitiveTypeByAsmSort.get(type.getSort()); - return jvmPrimitiveType != null ? asmTypeByFqNameWithoutInnerClasses(jvmPrimitiveType.getWrapperFqName()) : type; + return jvmPrimitiveType != null ? asmTypeByFqNameWithoutInnerClasses(jvmPrimitiveType.getWrapperFqName()) : null; } @NotNull diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInArrayLoopGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInArrayLoopGenerator.kt index 115e1902a1a..89fb3bcd5b8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInArrayLoopGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInArrayLoopGenerator.kt @@ -78,12 +78,13 @@ class ForInArrayLoopGenerator( } override fun assignToLoopParameter() { - val arrayElParamType = if (KotlinBuiltIns.isArray(loopRangeType)) boxType(asmElementType) else asmElementType + val arrayElParamType = + if (KotlinBuiltIns.isArray(loopRangeType)) boxType(asmElementType, elementType, codegen.state) else asmElementType v.load(arrayVar, OBJECT_TYPE) v.load(indexVar, Type.INT_TYPE) v.aload(arrayElParamType) - StackValue.onStack(arrayElParamType).put(asmElementType, codegen.v) + StackValue.onStack(arrayElParamType, elementType).put(asmElementType, elementType, codegen.v) v.store(loopParameterVar, asmElementType) } diff --git a/compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt b/compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt new file mode 100644 index 00000000000..ba6b33c3ccb --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt @@ -0,0 +1,16 @@ +// !LANGUAGE: +InlineClasses +// WITH_RUNTIME +// IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND: JS_IR + +inline class Foo(val arg: Int) + +fun box(): String { + val arr = arrayOf(Foo(1), Foo(2)) + var sum = 0 + for (el in arr) { + sum += el.arg + } + + return if (sum != 3) "Fail" else "OK" +} diff --git a/compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt b/compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt new file mode 100644 index 00000000000..ab642d56920 --- /dev/null +++ b/compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt @@ -0,0 +1,21 @@ +// WITH_UNSIGNED +// IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND: JS_IR + +fun box(): String { + var sum = 0u + for (el in arrayOf(1u, 2u, 3u)) { + sum += el + } + + if (sum != 6u) return "Fail 1" + + sum = 0u + for (el in uintArrayOf(10u, 20u)) { + sum += el + } + + if (sum != 30u) return "Fail 2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index d5b21dd20a4..1c489262669 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11126,6 +11126,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @TestMetadata("iterateOverArrayOfInlineClassValues.kt") + public void testIterateOverArrayOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -21242,6 +21247,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/unsignedTypes/evaluateConstructorOfUnsignedType.kt"); } + @TestMetadata("iterateOverArrayOfUnsignedValues.kt") + public void testIterateOverArrayOfUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); + } + @TestMetadata("unsignedLiteralsWithSignedOverflow.kt") public void testUnsignedLiteralsWithSignedOverflow() throws Exception { runTest("compiler/testData/codegen/box/unsignedTypes/unsignedLiteralsWithSignedOverflow.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index c7843d8af41..6c15ddb7d7b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11126,6 +11126,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @TestMetadata("iterateOverArrayOfInlineClassValues.kt") + public void testIterateOverArrayOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -21242,6 +21247,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/unsignedTypes/evaluateConstructorOfUnsignedType.kt"); } + @TestMetadata("iterateOverArrayOfUnsignedValues.kt") + public void testIterateOverArrayOfUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); + } + @TestMetadata("unsignedLiteralsWithSignedOverflow.kt") public void testUnsignedLiteralsWithSignedOverflow() throws Exception { runTest("compiler/testData/codegen/box/unsignedTypes/unsignedLiteralsWithSignedOverflow.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9e75938993d..8eade582a20 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11126,6 +11126,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @TestMetadata("iterateOverArrayOfInlineClassValues.kt") + public void testIterateOverArrayOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -21242,6 +21247,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/unsignedTypes/evaluateConstructorOfUnsignedType.kt"); } + @TestMetadata("iterateOverArrayOfUnsignedValues.kt") + public void testIterateOverArrayOfUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); + } + @TestMetadata("unsignedLiteralsWithSignedOverflow.kt") public void testUnsignedLiteralsWithSignedOverflow() throws Exception { runTest("compiler/testData/codegen/box/unsignedTypes/unsignedLiteralsWithSignedOverflow.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 2921cebb1f9..4cb7f4c1f84 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -9776,6 +9776,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @TestMetadata("iterateOverArrayOfInlineClassValues.kt") + public void testIterateOverArrayOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -19252,6 +19257,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/unsignedTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true); } + @TestMetadata("iterateOverArrayOfUnsignedValues.kt") + public void testIterateOverArrayOfUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); + } + @TestMetadata("varargsOfUnsignedTypes.kt") public void testVarargsOfUnsignedTypes() throws Exception { runTest("compiler/testData/codegen/box/unsignedTypes/varargsOfUnsignedTypes.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 722e87a08d2..e55f3a35e83 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 @@ -10771,6 +10771,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @TestMetadata("iterateOverArrayOfInlineClassValues.kt") + public void testIterateOverArrayOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -20247,6 +20252,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/unsignedTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("iterateOverArrayOfUnsignedValues.kt") + public void testIterateOverArrayOfUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); + } + @TestMetadata("varargsOfUnsignedTypes.kt") public void testVarargsOfUnsignedTypes() throws Exception { runTest("compiler/testData/codegen/box/unsignedTypes/varargsOfUnsignedTypes.kt");