Tests for bug in CFA: no return in when() is now detected

This commit is contained in:
Andrey Breslav
2013-12-02 22:49:35 +04:00
parent ec39105183
commit b15b075484
6 changed files with 56 additions and 1 deletions
@@ -0,0 +1,33 @@
== illegalWhenBlock ==
fun illegalWhenBlock(a: Any): Any {
when(a) {
is Int -> return a
is String -> return a
}
}
---------------------
L0:
<START> NEXT:[v(a: Any)] PREV:[]
v(a: Any) NEXT:[w(a)] PREV:[<START>]
w(a) NEXT:[r(a)] PREV:[v(a: Any)]
r(a) NEXT:[jmp?(L4)] PREV:[w(a)]
jmp?(L4) NEXT:[jmp?(L6), r(a)] PREV:[r(a)]
L3:
r(a) NEXT:[ret(*) L1] PREV:[jmp?(L4)]
ret(*) L1 NEXT:[<END>] PREV:[r(a)]
- jmp(L2) NEXT:[<END>] PREV:[]
L4:
jmp?(L6) NEXT:[<END>, r(a)] PREV:[jmp?(L4)]
L5:
r(a) NEXT:[ret(*) L1] PREV:[jmp?(L6)]
ret(*) L1 NEXT:[<END>] PREV:[r(a)]
- jmp(L2) NEXT:[<END>] PREV:[]
L1:
L2:
L6:
<END> NEXT:[<SINK>] PREV:[ret(*) L1, jmp?(L6), ret(*) L1]
error:
<ERROR> NEXT:[<SINK>] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<ERROR>, <END>]
=====================
+6
View File
@@ -0,0 +1,6 @@
fun illegalWhenBlock(a: Any): Any {
when(a) {
is Int -> return a
is String -> return a
}
}
@@ -0,0 +1,6 @@
fun illegalWhenBlock(a: Any): Int {
when(a) {
is Int -> return a
is String -> return a.length
}
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -150,7 +150,7 @@ fun illegalWhenBlock(a: Any): Int {
is Int -> return a
is String -> return <!TYPE_MISMATCH!>a<!>
}
}
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun declarations(a: Any?) {
if (a is String) {
val <!UNUSED_VARIABLE!>p4<!>: String = a
@@ -166,6 +166,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest {
doTest("compiler/testData/cfg/ReturnFromExpression.kt");
}
@TestMetadata("returnsInWhen.kt")
public void testReturnsInWhen() throws Exception {
doTest("compiler/testData/cfg/returnsInWhen.kt");
}
@TestMetadata("ShortFunction.kt")
public void testShortFunction() throws Exception {
doTest("compiler/testData/cfg/ShortFunction.kt");
@@ -1407,6 +1407,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/DeadCode.kt");
}
@TestMetadata("definiteReturnInWhen.kt")
public void testDefiniteReturnInWhen() throws Exception {
doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/definiteReturnInWhen.kt");
}
@TestMetadata("kt1001.kt")
public void testKt1001() throws Exception {
doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1001.kt");