Fix fallthrough in suspendable switch [#KT-22694, #KT-23687]

* do not explicitly put break for each case
* add test for related cases
This commit is contained in:
Roman Artemev
2018-07-23 14:57:14 +03:00
committed by Roman Artemev
parent 0c6256d003
commit 5241b37ad9
8 changed files with 188 additions and 2 deletions
@@ -0,0 +1,49 @@
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
// WITH_COROUTINES
// COMMON_COROUTINES_TEST
import helpers.*
import COROUTINES_PACKAGE.*
import COROUTINES_PACKAGE.intrinsics.*
enum class Foo(vararg expected: String) {
A("start", "A", "end"),
B("start", "BCD", "end"),
C("start", "BCD", "end"),
D("start", "BCD", "end"),
E("start", "E", "end"),
F("start", "end");
val expected = expected.toList()
}
fun box(): String {
for (c in Foo.values()) {
val actual = getSequence(c).toList()
if (actual != c.expected) {
return "FAIL: -- ${c.expected} != $actual"
}
}
return "OK"
}
fun getSequence(a: Foo) =
buildSequence {
yield("start")
when (a) {
Foo.A -> {
yield("A")
}
Foo.B,
Foo.C,
Foo.D-> {
yield("BCD")
}
Foo.E-> {
yield("E")
}
}
yield("end")
}
@@ -0,0 +1,49 @@
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
// WITH_COROUTINES
// COMMON_COROUTINES_TEST
import helpers.*
import COROUTINES_PACKAGE.*
import COROUTINES_PACKAGE.intrinsics.*
var result = ""
fun id(s: String) { result += s }
suspend fun bar() = Unit
suspend fun foo(a: Int) {
when (a) {
0 -> {
id("0")
bar() // slice switch
}
1, 2 -> {
id("$a")
}
else -> Unit
}
}
fun builder(callback: suspend () -> Unit) {
callback.startCoroutine(object : ContinuationAdapter<Unit>() {
override val context: CoroutineContext = EmptyCoroutineContext
override fun resume(value: Unit) = Unit
override fun resumeWithException(exception: Throwable) {
id("FAIL WITH EXCEPTION: ${exception.message}")
}
})
}
fun box():String {
id("a")
builder {
foo(0)
foo(1)
foo(2)
}
id("b")
if (result != "a012b") return "FAIL: $result"
return "OK"
}
@@ -6130,6 +6130,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/ifStatement.kt", "kotlin.coroutines");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines");
}
@TestMetadata("labeledWhile.kt")
public void testLabeledWhile_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/labeledWhile.kt", "kotlin.coroutines.experimental");
@@ -6180,6 +6190,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/throwInTryWithHandleResult.kt", "kotlin.coroutines");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines");
}
@TestMetadata("whileStatement.kt")
public void testWhileStatement_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whileStatement.kt", "kotlin.coroutines.experimental");
@@ -6130,6 +6130,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/ifStatement.kt", "kotlin.coroutines");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines");
}
@TestMetadata("labeledWhile.kt")
public void testLabeledWhile_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/labeledWhile.kt", "kotlin.coroutines.experimental");
@@ -6180,6 +6190,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/throwInTryWithHandleResult.kt", "kotlin.coroutines");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines");
}
@TestMetadata("whileStatement.kt")
public void testWhileStatement_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whileStatement.kt", "kotlin.coroutines.experimental");
@@ -6130,6 +6130,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/ifStatement.kt", "kotlin.coroutines");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines");
}
@TestMetadata("labeledWhile.kt")
public void testLabeledWhile_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/labeledWhile.kt", "kotlin.coroutines.experimental");
@@ -6180,6 +6190,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/throwInTryWithHandleResult.kt", "kotlin.coroutines");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines");
}
@TestMetadata("whileStatement.kt")
public void testWhileStatement_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whileStatement.kt", "kotlin.coroutines.experimental");
@@ -98,8 +98,6 @@ class CoroutineBodyTransformer(private val context: CoroutineTransformationConte
currentBlock = caseBlock
jsCase.statements.forEach { accept(it) }
currentBlock.statements += stateAndJump(jointBlock, x)
jsCase.statements.clear()
jsCase.statements += caseBlock.statements
}
@@ -5410,6 +5410,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/ifStatement.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("labeledWhile.kt")
public void testLabeledWhile_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/labeledWhile.kt", "kotlin.coroutines.experimental");
@@ -5435,6 +5440,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/throwInTryWithHandleResult.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("whileStatement.kt")
public void testWhileStatement_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whileStatement.kt", "kotlin.coroutines.experimental");
@@ -5855,6 +5855,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/ifStatement.kt", "kotlin.coroutines");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("kt22694.kt")
public void testKt22694_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/kt22694.kt", "kotlin.coroutines");
}
@TestMetadata("labeledWhile.kt")
public void testLabeledWhile_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/labeledWhile.kt", "kotlin.coroutines.experimental");
@@ -5905,6 +5915,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/throwInTryWithHandleResult.kt", "kotlin.coroutines");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines.experimental");
}
@TestMetadata("whenWithSuspensions.kt")
public void testWhenWithSuspensions_1_3() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whenWithSuspensions.kt", "kotlin.coroutines");
}
@TestMetadata("whileStatement.kt")
public void testWhileStatement_1_2() throws Exception {
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/controlFlow/whileStatement.kt", "kotlin.coroutines.experimental");