diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt index bf134b60388..5e05a07390b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt @@ -44,6 +44,7 @@ abstract class AbstractForLoopGenerator( protected var loopParameterVar: Int = -1 protected lateinit var loopParameterType: Type + protected lateinit var loopParameterKotlinType: KotlinType override fun beforeLoop() { val loopParameter = forExpression.loopParameter ?: return @@ -51,11 +52,13 @@ abstract class AbstractForLoopGenerator( if (multiParameter != null) { // E tmp = tmp.next() loopParameterType = asmElementType + loopParameterKotlinType = elementType loopParameterVar = createLoopTempVariable(asmElementType) } else { // E e = tmp.next() val parameterDescriptor = bindingContext.get(BindingContext.VALUE_PARAMETER, loopParameter) - loopParameterType = codegen.asmType(parameterDescriptor!!.type) + loopParameterKotlinType = parameterDescriptor!!.type + loopParameterType = codegen.asmType(loopParameterKotlinType) loopParameterVar = codegen.myFrameMap.enter(parameterDescriptor, loopParameterType) scheduleLeaveVariable(Runnable { codegen.myFrameMap.leave(parameterDescriptor) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/IteratorForLoopGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/IteratorForLoopGenerator.kt index 8170cc26b22..7a8b56a9f16 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/IteratorForLoopGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/IteratorForLoopGenerator.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.* import org.jetbrains.kotlin.resolve.BindingContextUtils.getNotNull import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver +import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Type @@ -33,6 +34,7 @@ class IteratorForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForE private var iteratorVarIndex: Int = 0 private val iteratorCall: ResolvedCall private val nextCall: ResolvedCall + private val iteratorType: KotlinType private val asmTypeForIterator: Type init { @@ -43,7 +45,7 @@ class IteratorForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForE "No .iterator() function " + PsiDiagnosticUtils.atLocation(loopRange) ) - val iteratorType = iteratorCall.resultingDescriptor.returnType!! + this.iteratorType = iteratorCall.resultingDescriptor.returnType!! this.asmTypeForIterator = codegen.asmType(iteratorType) this.nextCall = getNotNull( @@ -58,7 +60,9 @@ class IteratorForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForE // Iterator tmp = c.iterator() iteratorVarIndex = createLoopTempVariable(asmTypeForIterator) - StackValue.local(iteratorVarIndex, asmTypeForIterator).store(codegen.invokeFunction(iteratorCall, StackValue.none()), v) + StackValue + .local(iteratorVarIndex, asmTypeForIterator, iteratorType) + .store(codegen.invokeFunction(iteratorCall, StackValue.none()), v) } override fun checkEmptyLoop(loopExit: Label) {} @@ -73,7 +77,7 @@ class IteratorForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForE "No hasNext() function " + PsiDiagnosticUtils.atLocation(loopRange) ) val fakeCall = codegen.makeFakeCall(TransientReceiver(iteratorCall.resultingDescriptor.returnType!!)) - val result = codegen.invokeFunction(fakeCall, hasNextCall, StackValue.local(iteratorVarIndex, asmTypeForIterator)) + val result = codegen.invokeFunction(fakeCall, hasNextCall, StackValue.local(iteratorVarIndex, asmTypeForIterator, iteratorType)) result.put(Type.BOOLEAN_TYPE, v) v.ifeq(loopExit) @@ -81,9 +85,9 @@ class IteratorForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForE override fun assignToLoopParameter() { val fakeCall = codegen.makeFakeCall(TransientReceiver(iteratorCall.resultingDescriptor.returnType!!)) - val value = codegen.invokeFunction(fakeCall, nextCall, StackValue.local(iteratorVarIndex, asmTypeForIterator)) + val value = codegen.invokeFunction(fakeCall, nextCall, StackValue.local(iteratorVarIndex, asmTypeForIterator, iteratorType)) - StackValue.local(loopParameterVar, loopParameterType).store(value, v) + StackValue.local(loopParameterVar, loopParameterType, loopParameterKotlinType).store(value, v) } override fun checkPostConditionAndIncrement(loopExit: Label) {} diff --git a/compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt b/compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt new file mode 100644 index 00000000000..576b3588167 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt @@ -0,0 +1,16 @@ +// !LANGUAGE: +InlineClasses +// WITH_RUNTIME +// IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND: JS_IR + +inline class Foo(val arg: String) + +fun box(): String { + val ls = listOf(Foo("abc"), Foo("def")) + var res = "" + for (el in ls) { + res += el.arg + } + + return if (res != "abcdef") "Fail" else "OK" +} diff --git a/compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.kt b/compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.kt new file mode 100644 index 00000000000..014bc3c460d --- /dev/null +++ b/compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.kt @@ -0,0 +1,13 @@ +// WITH_UNSIGNED +// IGNORE_BACKEND: JVM_IR +// IGNORE_BACKEND: JS_IR + +fun box(): String { + var sum = 0u + val ls = listOf(1u, 2u, 3u) + for (el in ls) { + sum += el + } + + return if (sum != 6u) "Fail" else "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 1c489262669..9de54753a31 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 @@ -11131,6 +11131,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); } + @TestMetadata("iterateOverListOfInlineClassValues.kt") + public void testIterateOverListOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -21252,6 +21257,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); } + @TestMetadata("iterateOverListOfBoxedUnsignedValues.kt") + public void testIterateOverListOfBoxedUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.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 6c15ddb7d7b..979a44d2ac2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11131,6 +11131,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); } + @TestMetadata("iterateOverListOfInlineClassValues.kt") + public void testIterateOverListOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -21252,6 +21257,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); } + @TestMetadata("iterateOverListOfBoxedUnsignedValues.kt") + public void testIterateOverListOfBoxedUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.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 8eade582a20..7ab399e6642 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11131,6 +11131,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); } + @TestMetadata("iterateOverListOfInlineClassValues.kt") + public void testIterateOverListOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -21252,6 +21257,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); } + @TestMetadata("iterateOverListOfBoxedUnsignedValues.kt") + public void testIterateOverListOfBoxedUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.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 4cb7f4c1f84..742c365cef7 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 @@ -9781,6 +9781,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); } + @TestMetadata("iterateOverListOfInlineClassValues.kt") + public void testIterateOverListOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -19262,6 +19267,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); } + @TestMetadata("iterateOverListOfBoxedUnsignedValues.kt") + public void testIterateOverListOfBoxedUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.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 e55f3a35e83..678fd8d1358 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 @@ -10776,6 +10776,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt"); } + @TestMetadata("iterateOverListOfInlineClassValues.kt") + public void testIterateOverListOfInlineClassValues() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/iterateOverListOfInlineClassValues.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); @@ -20257,6 +20262,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverArrayOfUnsignedValues.kt"); } + @TestMetadata("iterateOverListOfBoxedUnsignedValues.kt") + public void testIterateOverListOfBoxedUnsignedValues() throws Exception { + runTest("compiler/testData/codegen/box/unsignedTypes/iterateOverListOfBoxedUnsignedValues.kt"); + } + @TestMetadata("varargsOfUnsignedTypes.kt") public void testVarargsOfUnsignedTypes() throws Exception { runTest("compiler/testData/codegen/box/unsignedTypes/varargsOfUnsignedTypes.kt");