diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 1753748f97c..0e9ca1e25b6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -439,6 +439,7 @@ public class ExpressionCodegen extends JetVisitor implem private void generateForLoop(AbstractForLoopGenerator generator) { Label loopExit = new Label(); Label loopEntry = new Label(); + Label continueLabel = new Label(); generator.beforeLoop(); @@ -446,9 +447,10 @@ public class ExpressionCodegen extends JetVisitor implem generator.conditionAndJump(loopExit); generator.beforeBody(); - blockStackElements.push(new LoopBlockStackElement(loopExit, loopEntry, null)); + blockStackElements.push(new LoopBlockStackElement(loopExit, continueLabel, targetLabel(generator.forExpression))); generator.body(); blockStackElements.pop(); + v.mark(continueLabel); generator.afterBody(); v.goTo(loopEntry); diff --git a/compiler/testData/codegen/controlStructures/continueInFor.kt b/compiler/testData/codegen/controlStructures/continueInFor.kt new file mode 100644 index 00000000000..3014174af6a --- /dev/null +++ b/compiler/testData/codegen/controlStructures/continueInFor.kt @@ -0,0 +1,111 @@ +fun for_int_range(): Int { + var c = 0 + @loop for (i in 1..10) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_byte_range(): Int { + var c = 0 + val from: Byte = 1 + val to: Byte = 10 + @loop for (i in from..to) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_long_range(): Int { + var c = 0 + val from: Long = 1 + val to: Long = 10 + @loop for (i in from..to) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_int_list(): Int { + val a = java.util.ArrayList() + a.add(0); a.add(0); a.add(0); a.add(0); a.add(0) + a.add(0); a.add(0); a.add(0); a.add(0); a.add(0) + var c = 0 + @loop for (i in a) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_byte_list(): Int { + val a = java.util.ArrayList() + a.add(0); a.add(0); a.add(0); a.add(0); a.add(0) + a.add(0); a.add(0); a.add(0); a.add(0); a.add(0) + var c = 0 + @loop for (i in a) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_long_list(): Int { + val a = java.util.ArrayList() + a.add(0); a.add(0); a.add(0); a.add(0); a.add(0) + a.add(0); a.add(0); a.add(0); a.add(0); a.add(0) + var c = 0 + @loop for (i in a) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_double_list(): Int { + val a = java.util.ArrayList() + a.add(0.0); a.add(0.0); a.add(0.0); a.add(0.0); a.add(0.0) + a.add(0.0); a.add(0.0); a.add(0.0); a.add(0.0); a.add(0.0) + var c = 0 + @loop for (i in a) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_str_array(): Int { + val a = Array(10) {i -> "$i"} + var c = 0 + @loop for (i in a) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun for_intarray(): Int { + val a = IntArray(10) + var c = 0 + @loop for (i in a) { + if (c >= 5) continue @loop + c++ + } + return c +} + +fun box(): String { + if (for_int_range() != 5) return "fail 1" + if (for_byte_range() != 5) return "fail 2" + if (for_long_range() != 5) return "fail 3" + if (for_intarray() != 5) return "fail 4" + if (for_str_array() != 5) return "fail 5" + if (for_int_list() != 5) return "fail 6" + if (for_byte_list() != 5) return "fail 7" + if (for_long_list() != 5) return "fail 8" + if (for_double_list() != 5) return "fail 9" + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 5e71dbbe369..2e1b54ffab7 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -344,6 +344,11 @@ public class ControlStructuresTest extends CodegenTestCase { blackBoxFile("regressions/kt998.kt"); } + public void testContinueInFor() throws Exception { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_AND_ANNOTATIONS); + blackBoxFile("controlStructures/continueInFor.kt"); + } + public void testKt628() throws Exception { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt628.kt");