KT-5200 Mark unreachable code in lambdas

#KT-5200 Fixed
This commit is contained in:
Svetlana Isakova
2014-06-17 15:50:07 +04:00
parent abfc8ed7e8
commit 4279da12f5
4 changed files with 38 additions and 3 deletions
@@ -125,9 +125,12 @@ public class JetFlowInformationProvider {
public void checkFunction(@Nullable JetType expectedReturnType) {
UnreachableCode unreachableCode = collectUnreachableCode();
checkDefiniteReturn(expectedReturnType != null ? expectedReturnType : NO_EXPECTED_TYPE, unreachableCode);
reportUnreachableCode(unreachableCode);
if (subroutine instanceof JetFunctionLiteral) return;
checkDefiniteReturn(expectedReturnType != null ? expectedReturnType : NO_EXPECTED_TYPE, unreachableCode);
markTailCalls();
}
@@ -196,7 +199,7 @@ public class JetFlowInformationProvider {
JetElement element = localDeclarationInstruction.getElement();
if (element instanceof JetDeclarationWithBody) {
JetDeclarationWithBody localDeclaration = (JetDeclarationWithBody) element;
if (localDeclaration instanceof JetFunctionLiteral) continue;
CallableDescriptor functionDescriptor =
(CallableDescriptor) trace.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, localDeclaration);
JetType expectedType = functionDescriptor != null ? functionDescriptor.getReturnType() : null;
@@ -0,0 +1,27 @@
//KT-5200 Mark unreachable code in lambdas
fun test1(): String {
doCall @local {
() : String ->
throw NullPointerException()
<!UNREACHABLE_CODE!>"b3"<!> //unmarked
}
return "OK"
}
fun test2(nonLocal: String, b: Boolean): String {
doCall @local {
() : String ->
if (b) {
return@local "b1"
} else {
return@local "b2"
}
<!UNREACHABLE_CODE!>"b3"<!> //unmarked
}
return nonLocal
}
inline fun doCall(block: ()-> String) = block()
@@ -37,7 +37,7 @@ fun t3() : String {
else {
<!RETURN_NOT_ALLOWED!>return <!CONSTANT_EXPECTED_TYPE_MISMATCH!>2<!><!>
}
<!RETURN_NOT_ALLOWED_EXPLICIT_RETURN_TYPE_REQUIRED!>return@l 0<!>
<!RETURN_NOT_ALLOWED_EXPLICIT_RETURN_TYPE_REQUIRED, UNREACHABLE_CODE!>return@l 0<!>
}
)
invoker(
@@ -1546,6 +1546,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/deadCode/kt2585_3.kt");
}
@TestMetadata("kt5200DeadCodeInLambdas.kt")
public void testKt5200DeadCodeInLambdas() throws Exception {
doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/deadCode/kt5200DeadCodeInLambdas.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/controlFlowAnalysis/definiteReturn")