diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 8723651c70a..3e88801d0c1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -13433,6 +13433,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithExplicitUnit.kt"); } + @Test + @TestMetadata("LocalReturnWithFlexibleUnitType.kt") + public void testLocalReturnWithFlexibleUnitType() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt"); + } + @Test @TestMetadata("LocalReturnsWithExplicitReturnType.kt") public void testLocalReturnsWithExplicitReturnType() throws Exception { @@ -13445,6 +13451,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MixedReturnsFromLambda.kt"); } + @Test + @TestMetadata("MultipleLocalUnitReturns.kt") + public void testMultipleLocalUnitReturns() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt"); + } + @Test @TestMetadata("NoCommonSystem.kt") public void testNoCommonSystem() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index fe436dc57fa..a0ff7b88085 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -13433,6 +13433,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithExplicitUnit.kt"); } + @Test + @TestMetadata("LocalReturnWithFlexibleUnitType.kt") + public void testLocalReturnWithFlexibleUnitType() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt"); + } + @Test @TestMetadata("LocalReturnsWithExplicitReturnType.kt") public void testLocalReturnsWithExplicitReturnType() throws Exception { @@ -13445,6 +13451,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MixedReturnsFromLambda.kt"); } + @Test + @TestMetadata("MultipleLocalUnitReturns.kt") + public void testMultipleLocalUnitReturns() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt"); + } + @Test @TestMetadata("NoCommonSystem.kt") public void testNoCommonSystem() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index d78c6f08315..62f884fcf64 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -13433,6 +13433,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithExplicitUnit.kt"); } + @Test + @TestMetadata("LocalReturnWithFlexibleUnitType.kt") + public void testLocalReturnWithFlexibleUnitType() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt"); + } + @Test @TestMetadata("LocalReturnsWithExplicitReturnType.kt") public void testLocalReturnsWithExplicitReturnType() throws Exception { @@ -13445,6 +13451,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MixedReturnsFromLambda.kt"); } + @Test + @TestMetadata("MultipleLocalUnitReturns.kt") + public void testMultipleLocalUnitReturns() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt"); + } + @Test @TestMetadata("NoCommonSystem.kt") public void testNoCommonSystem() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 06d9dcd69be..8deafa1bd88 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -13439,6 +13439,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithExplicitUnit.kt"); } + @Test + @TestMetadata("LocalReturnWithFlexibleUnitType.kt") + public void testLocalReturnWithFlexibleUnitType() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt"); + } + @Test @TestMetadata("LocalReturnsWithExplicitReturnType.kt") public void testLocalReturnsWithExplicitReturnType() throws Exception { @@ -13451,6 +13457,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MixedReturnsFromLambda.kt"); } + @Test + @TestMetadata("MultipleLocalUnitReturns.kt") + public void testMultipleLocalUnitReturns() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt"); + } + @Test @TestMetadata("NoCommonSystem.kt") public void testNoCommonSystem() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt index 6c2acf0bbc7..093440beb67 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt @@ -91,7 +91,7 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() { } } } else if (resultExpression.source?.kind is KtFakeSourceElementKind.ImplicitUnit && - !functionReturnType.isUnit && + !functionReturnType.lowerBoundIfFlexible().isUnit && shouldCheckMismatchForAnonymousFunction(targetElement, expression) ) { // Disallow cases like @@ -120,8 +120,11 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() { private fun shouldCheckMismatchForAnonymousFunction(targetElement: FirFunction, expression: FirReturnExpression): Boolean { if (targetElement !is FirAnonymousFunction || !targetElement.isLambda) return true val cfgNodes = targetElement.controlFlowGraphReference?.controlFlowGraph?.exitNode?.previousCfgNodes ?: return true - // Check if any return expression other than the current is explicit - return cfgNodes.any { if (it.fir === expression) false else it.fir is FirReturnExpression } + // Check if any return expression other than the current is explicit and not Unit + return cfgNodes.any { + val fir = it.fir + if (fir === expression) false else fir is FirReturnExpression && !fir.result.resolvedType.isUnit + } } } diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt new file mode 100644 index 00000000000..8df6b99267f --- /dev/null +++ b/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt @@ -0,0 +1,20 @@ +// FIR_IDENTICAL + +// FILE: JavaClass.java + +@FunctionalInterface +public interface JavaClass { + public T invoke(); +} + +// FILE: main.kt + +fun main() { + JavaClass { + if (true) { + return@JavaClass + } else { + return@JavaClass + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt new file mode 100644 index 00000000000..3dbe43096e6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL + +fun execute(block: () -> T): T = block() + +fun main() { + execute { + if (true) return@execute + if (true) return@execute Unit + execute { Any() } + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 75a6a025ec1..8846cefbdbe 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -13439,6 +13439,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithExplicitUnit.kt"); } + @Test + @TestMetadata("LocalReturnWithFlexibleUnitType.kt") + public void testLocalReturnWithFlexibleUnitType() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnWithFlexibleUnitType.kt"); + } + @Test @TestMetadata("LocalReturnsWithExplicitReturnType.kt") public void testLocalReturnsWithExplicitReturnType() throws Exception { @@ -13451,6 +13457,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MixedReturnsFromLambda.kt"); } + @Test + @TestMetadata("MultipleLocalUnitReturns.kt") + public void testMultipleLocalUnitReturns() throws Exception { + runTest("compiler/testData/diagnostics/tests/functionLiterals/return/MultipleLocalUnitReturns.kt"); + } + @Test @TestMetadata("NoCommonSystem.kt") public void testNoCommonSystem() throws Exception {