diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index e502a56ede2..0f5e8b81996 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -3533,6 +3533,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt39000.kt"); } + @Test + @TestMetadata("kt50788.kt") + public void testKt50788() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt"); + } + @Test @TestMetadata("multipleCasts.kt") public void testMultipleCasts() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 4ec2d348fcc..f4c6432ebab 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -3124,6 +3124,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt39000.kt"); } + @TestMetadata("kt50788.kt") + public void testKt50788() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt"); + } + @TestMetadata("multipleCasts.kt") public void testMultipleCasts() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.fir.txt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.fir.txt new file mode 100644 index 00000000000..123697c878a --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.fir.txt @@ -0,0 +1,5 @@ +FILE: main.kt + public final fun foo(mapper: R|Mapper|, cls: R|java/lang/Class?|): R|kotlin/Unit| { + lval result: R|T & Any| = R|/mapper|.R|/Mapper.readValue||>(R|/cls|)!! + R|/result|.R|kotlin/CharSequence.length| + } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt new file mode 100644 index 00000000000..e9073ef5219 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt @@ -0,0 +1,14 @@ +// ISSUE: KT-50788 +// FILE: Mapper.java +public class Mapper { + public T readValue(Class valueType) { + return null; + } +} + +// FILE: main.kt + +fun foo(mapper: Mapper, cls: Class?) { + val result = mapper.readValue(cls)!! // The type of result is expected to be T & Any here, but in fact it's just T + result.length +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index f09a039f0b6..e21a64aa19a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -3533,6 +3533,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt39000.kt"); } + @Test + @TestMetadata("kt50788.kt") + public void testKt50788() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt"); + } + @Test @TestMetadata("multipleCasts.kt") public void testMultipleCasts() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 9408754e207..32335c972a0 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -3533,6 +3533,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt39000.kt"); } + @Test + @TestMetadata("kt50788.kt") + public void testKt50788() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/kt50788.kt"); + } + @Test @TestMetadata("multipleCasts.kt") public void testMultipleCasts() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index a09bab186c6..f72e8a46ed1 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -57,7 +57,7 @@ private fun ConeTypeContext.makesSenseToBeDefinitelyNotNull(type: ConeKotlinType is ConeTypeParameterType -> type.isNullableType() // Actually, this branch should work for type parameters as well, but it breaks some cases. See KT-40114. // Basically, if we have `T : X..X?`, then `T <: Any` but we still have `T` != `T & Any`. - is ConeTypeVariableType, is ConeCapturedType -> + is ConeTypeVariableType, is ConeCapturedType, is ConeFlexibleType -> !AbstractNullabilityChecker.isSubtypeOfAny( newTypeCheckerState(errorTypesEqualToAnything = false, stubTypesEqualToAnything = false), type ) @@ -73,7 +73,7 @@ fun ConeDefinitelyNotNullType.Companion.create( ): ConeDefinitelyNotNullType? { return when { original is ConeDefinitelyNotNullType -> original - typeContext.makesSenseToBeDefinitelyNotNull(original) -> ConeDefinitelyNotNullType(original) + typeContext.makesSenseToBeDefinitelyNotNull(original) -> ConeDefinitelyNotNullType(original.coneLowerBoundIfFlexible()) else -> null } } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeContravariant.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeContravariant.fir.kt index e1980d1a743..59b4dc1f4a6 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeContravariant.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeContravariant.fir.kt @@ -77,8 +77,8 @@ fun test() { select2(Test.foo(get()), getIn()) select3(get(), getIn()) select3(get(), Test.foo(getIn())) - select3(Test.foo(get()), Test.foo(getIn())) - select3(Test.foo(get()), getIn()) + select3(Test.foo(get()), Test.foo(getIn())) + select3(Test.foo(get()), getIn()) "" } }