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 3ae778ebca6..e5ca658fb94 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 @@ -14618,6 +14618,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt"); } + @Test + @TestMetadata("genericCallInThrow.kt") + public void testGenericCallInThrow() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt"); + } + @Test @TestMetadata("hasErrorInConstrainingTypes.kt") public void testHasErrorInConstrainingTypes() 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 7396f4f4745..5426ff4e32f 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 @@ -14618,6 +14618,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt"); } + @Test + @TestMetadata("genericCallInThrow.kt") + public void testGenericCallInThrow() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt"); + } + @Test @TestMetadata("hasErrorInConstrainingTypes.kt") public void testHasErrorInConstrainingTypes() 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 81975dabc0d..10d56dc70f3 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 @@ -14618,6 +14618,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt"); } + @Test + @TestMetadata("genericCallInThrow.kt") + public void testGenericCallInThrow() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt"); + } + @Test @TestMetadata("hasErrorInConstrainingTypes.kt") public void testHasErrorInConstrainingTypes() 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 7dd620aa2f0..859c3f78bc8 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 @@ -14624,6 +14624,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt"); } + @Test + @TestMetadata("genericCallInThrow.kt") + public void testGenericCallInThrow() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt"); + } + @Test @TestMetadata("hasErrorInConstrainingTypes.kt") public void testHasErrorInConstrainingTypes() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt index e2f508b3f3c..fd37b68cfc8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt @@ -218,10 +218,13 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes override fun transformThrowExpression( throwExpression: FirThrowExpression, - data: ResolutionMode + data: ResolutionMode, ): FirStatement { - return transformer.transformExpression(throwExpression, ResolutionMode.ContextIndependent).also { - dataFlowAnalyzer.exitThrowExceptionNode(it as FirThrowExpression) + return throwExpression.apply { + replaceTypeRef(throwExpression.typeRef.transform(transformer, data)) + transformAnnotations(transformer, data) + transformException(transformer, withExpectedType(session.builtinTypes.throwableType)) + dataFlowAnalyzer.exitThrowExceptionNode(this) } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThrowExpression.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThrowExpression.kt index 8e96b59a9d7..839c93d08b5 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThrowExpression.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThrowExpression.kt @@ -32,4 +32,6 @@ abstract class FirThrowExpression : FirExpression() { abstract override fun replaceAnnotations(newAnnotations: List) abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirThrowExpression + + abstract fun transformException(transformer: FirTransformer, data: D): FirThrowExpression } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt index eae8274393b..fbca58f9fdc 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt @@ -40,7 +40,7 @@ internal class FirThrowExpressionImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirThrowExpressionImpl { typeRef = typeRef.transform(transformer, data) transformAnnotations(transformer, data) - exception = exception.transform(transformer, data) + transformException(transformer, data) return this } @@ -49,6 +49,11 @@ internal class FirThrowExpressionImpl( return this } + override fun transformException(transformer: FirTransformer, data: D): FirThrowExpressionImpl { + exception = exception.transform(transformer, data) + return this + } + override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index e0e94e6bd3c..22626ddcd73 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -620,7 +620,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild } throwExpression.configure { - +field("exception", expression) + +field("exception", expression).withTransform() } variableAssignment.configure { diff --git a/compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt b/compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt new file mode 100644 index 00000000000..1338f292940 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt @@ -0,0 +1,4 @@ +// FIR_IDENTICAL + +fun a(): T = TODO() +val b: Unit = throw a() \ No newline at end of file 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 a73dca5afc7..6890a191382 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 @@ -14624,6 +14624,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/genericAssignmentOperator.kt"); } + @Test + @TestMetadata("genericCallInThrow.kt") + public void testGenericCallInThrow() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/genericCallInThrow.kt"); + } + @Test @TestMetadata("hasErrorInConstrainingTypes.kt") public void testHasErrorInConstrainingTypes() throws Exception {