diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index ce37fbf18e9..7e935e77ad1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -24181,6 +24181,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/kt47459.kt"); } + @Test + @TestMetadata("lostRawTypeAfterElvis.kt") + public void testLostRawTypeAfterElvis() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt"); + } + @Test @TestMetadata("noTypeArgumentsForRawScopedMembers.kt") public void testNoTypeArgumentsForRawScopedMembers() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 947ab20a841..75f482d05e0 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -24181,6 +24181,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/kt47459.kt"); } + @Test + @TestMetadata("lostRawTypeAfterElvis.kt") + public void testLostRawTypeAfterElvis() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt"); + } + @Test @TestMetadata("noTypeArgumentsForRawScopedMembers.kt") public void testNoTypeArgumentsForRawScopedMembers() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 12b70475830..5220ef21f91 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -24181,6 +24181,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/kt47459.kt"); } + @Test + @TestMetadata("lostRawTypeAfterElvis.kt") + public void testLostRawTypeAfterElvis() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt"); + } + @Test @TestMetadata("noTypeArgumentsForRawScopedMembers.kt") public void testNoTypeArgumentsForRawScopedMembers() 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 a2272bf3024..ff6d27dc18a 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 @@ -249,7 +249,10 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran if (result.rhs.typeRef.coneTypeSafe()?.isNothing == true) { val lhsType = result.lhs.typeRef.coneTypeSafe() if (lhsType != null) { - val newReturnType = lhsType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext) + // Converting to non-raw type is necessary to preserver the K1 semantics (see KT-54526) + val newReturnType = + lhsType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext) + .convertToNonRawVersion() result.replaceTypeRef(result.typeRef.resolvedTypeFromPrototype(newReturnType)) isLhsNotNull = true } diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt new file mode 100644 index 00000000000..0858d81142d --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt @@ -0,0 +1,22 @@ +// SKIP_TXT +// FIR_IDENTICAL +// FILE: Generic.java +public class Generic { + public static class ML {} + public static Generic create() { return null; } + public E foo(ML w) { } +} + +// FILE: main.kt +import Generic.ML + +fun main(w: ML) { + val generic2 = Generic.create() ?: return + + // Not enough information to infer E (both K1 and K2 after KT-41794 is done) + // Because generic information is erased from the raw type scope of `generic1` + // But the parameter E is still there (that is a questionable behavior) + + // `generic2` does have just non-raw type `Generic..Generic<*>?` + generic2.foo(w).length // OK in K1, fails in K2 after KT-41794 is done +} 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 1ee89d8c6f7..45d09c45331 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 @@ -24187,6 +24187,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/kt47459.kt"); } + @Test + @TestMetadata("lostRawTypeAfterElvis.kt") + public void testLostRawTypeAfterElvis() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/lostRawTypeAfterElvis.kt"); + } + @Test @TestMetadata("noTypeArgumentsForRawScopedMembers.kt") public void testNoTypeArgumentsForRawScopedMembers() throws Exception {