diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index aa2a7427616..e6e1862b24d 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -11087,6 +11087,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/inference/regressions/kt3559.kt"); } + @TestMetadata("kt35844.kt") + public void testKt35844() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt35844.kt"); + } + @TestMetadata("kt4420.kt") public void testKt4420() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt4420.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager.kt index 72da23cedac..19a706b527c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager.kt @@ -34,7 +34,11 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.checker.TypeIntersector +import org.jetbrains.kotlin.types.checker.intersectTypes +import org.jetbrains.kotlin.types.checker.intersectWrappedTypes import org.jetbrains.kotlin.types.typeUtil.expandIntersectionTypeIfNecessary +import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* class SmartCastManager(private val argumentTypeResolver: ArgumentTypeResolver) { @@ -134,7 +138,15 @@ class SmartCastManager(private val argumentTypeResolver: ArgumentTypeResolver) { else listOf(expectedType) - for (possibleType in c.dataFlowInfo.getCollectedTypes(dataFlowValue, c.languageVersionSettings)) { + val collectedTypes = c.dataFlowInfo.getCollectedTypes(dataFlowValue, c.languageVersionSettings).toMutableList() + + if (collectedTypes.isNotEmpty() && c.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) { + // Sometime expected type may be inferred to be an intersection of all of the smart-cast types + val typeToIntersect = collectedTypes + dataFlowValue.type + collectedTypes.addIfNotNull(intersectWrappedTypes(typeToIntersect)) + } + + for (possibleType in collectedTypes) { if (expectedTypes.any { argumentTypeResolver.isSubtypeOfForArgumentType(possibleType, it) } && (additionalPredicate == null || additionalPredicate(possibleType)) ) { diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt35844.fir.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt35844.fir.kt new file mode 100644 index 00000000000..d4e793c5d54 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt35844.fir.kt @@ -0,0 +1,17 @@ +// SKIP_TXT +// !DIAGNOSTICS: -UNUSED_PARAMETER +// !LANGUAGE: +NewInference + +class A + +class B { + fun b(): T = TODO() +} + +fun foo(c: A): Y = TODO() + +fun main(a: A) { + a as A> + + foo(a).b() +} diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt35844.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt35844.kt new file mode 100644 index 00000000000..126a39c63bd --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt35844.kt @@ -0,0 +1,17 @@ +// SKIP_TXT +// !DIAGNOSTICS: -UNUSED_PARAMETER +// !LANGUAGE: +NewInference + +class A + +class B { + fun b(): T = TODO() +} + +fun foo(c: A): Y = TODO() + +fun main(a: A) { + a as A> + + foo(a).b() +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index a1dde9872f1..653977fb788 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -11094,6 +11094,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt3559.kt"); } + @TestMetadata("kt35844.kt") + public void testKt35844() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt35844.kt"); + } + @TestMetadata("kt4420.kt") public void testKt4420() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt4420.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 40130ba333d..ac5e4e069a6 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -11089,6 +11089,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inference/regressions/kt3559.kt"); } + @TestMetadata("kt35844.kt") + public void testKt35844() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt35844.kt"); + } + @TestMetadata("kt4420.kt") public void testKt4420() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt4420.kt");