[FIR] Report no return diagnostic on functions returning Nothing
Previously, the NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY diagnostic was not reported at all on functions which return Nothing. However, in K1, if the function returns Nothing but the body is empty or doesn't contain a Nothing expression, this diagnostic would be reported. The checker in K2 has been updated to report this diagnostic on functions which return Nothing as well. ^KT-55965 Fixed
This commit is contained in:
+1
-1
@@ -35,7 +35,7 @@ object FirFunctionReturnChecker : FirFunctionChecker() {
|
|||||||
if (declaration is FirConstructor) return
|
if (declaration is FirConstructor) return
|
||||||
if (declaration is FirAnonymousFunction && declaration.isLambda) return
|
if (declaration is FirAnonymousFunction && declaration.isLambda) return
|
||||||
val returnType = declaration.returnTypeRef.coneType.fullyExpandedType(context.session)
|
val returnType = declaration.returnTypeRef.coneType.fullyExpandedType(context.session)
|
||||||
if (returnType.isUnit || returnType.isNothing) return
|
if (returnType.isUnit) return
|
||||||
val graph = declaration.controlFlowGraphReference?.controlFlowGraph ?: return
|
val graph = declaration.controlFlowGraphReference?.controlFlowGraph ?: return
|
||||||
|
|
||||||
val blockExitNode = graph.exitNode.previousNodes.lastOrNull { it is BlockExitNode } ?: return
|
val blockExitNode = graph.exitNode.previousNodes.lastOrNull { it is BlockExitNode } ?: return
|
||||||
|
|||||||
@@ -158,6 +158,8 @@ fun illegalReturnIf(): Char {
|
|||||||
fun returnNothing(): Nothing {
|
fun returnNothing(): Nothing {
|
||||||
throw <!TYPE_MISMATCH!>1<!>
|
throw <!TYPE_MISMATCH!>1<!>
|
||||||
}
|
}
|
||||||
|
fun returnNothingEmpty(): Nothing {
|
||||||
|
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
|
||||||
fun f(): Int {
|
fun f(): Int {
|
||||||
if (1 < 2) { return 1 } else returnNothing()
|
if (1 < 2) { return 1 } else returnNothing()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,6 +158,8 @@ fun illegalReturnIf(): Char {
|
|||||||
fun returnNothing(): Nothing {
|
fun returnNothing(): Nothing {
|
||||||
throw <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>
|
throw <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>
|
||||||
}
|
}
|
||||||
|
fun returnNothingEmpty(): Nothing {
|
||||||
|
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
|
||||||
fun f(): Int {
|
fun f(): Int {
|
||||||
if (1 < 2) { return 1 } else returnNothing()
|
if (1 < 2) { return 1 } else returnNothing()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public fun nonBlockNoReturnIfUnitInOneBranch(): kotlin.Int
|
|||||||
public fun nonBlockReturnIfEmptyIf(): kotlin.Int
|
public fun nonBlockReturnIfEmptyIf(): kotlin.Int
|
||||||
public fun none(): kotlin.Unit
|
public fun none(): kotlin.Unit
|
||||||
public fun returnNothing(): kotlin.Nothing
|
public fun returnNothing(): kotlin.Nothing
|
||||||
|
public fun returnNothingEmpty(): kotlin.Nothing
|
||||||
public fun test1(): kotlin.Any
|
public fun test1(): kotlin.Any
|
||||||
public fun test2(): kotlin.Any
|
public fun test2(): kotlin.Any
|
||||||
public fun test3(): kotlin.Any
|
public fun test3(): kotlin.Any
|
||||||
|
|||||||
Reference in New Issue
Block a user