diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index c3cb35d869f..5b9a0c449cd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVari import org.jetbrains.kotlin.fir.resolve.inference.ResolvedCallableReferenceAtom import org.jetbrains.kotlin.fir.resolve.inference.csBuilder import org.jetbrains.kotlin.fir.resolve.inference.hasBuilderInferenceAnnotation +import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExplicitTypeParameterConstraintPosition import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.FirUnstableSmartcastTypeScope @@ -34,6 +35,7 @@ import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visibilityChecker import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.resolve.calls.inference.isSubtypeConstraintCompatible +import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.* import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability @@ -572,7 +574,13 @@ internal object CheckIncompatibleTypeVariableUpperBounds : ResolutionStage() { continue val emptyIntersectionTypeInfo = candidate.system.getEmptyIntersectionTypeKind(upperTypes) ?: continue - + if (variableWithConstraints.constraints.any { + it.kind == ConstraintKind.EQUALITY && + it.position.initialConstraint.position is ConeExplicitTypeParameterConstraintPosition + } + ) { + return + } sink.yieldDiagnostic( @Suppress("UNCHECKED_CAST") InferredEmptyIntersectionDiagnostic( diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index ffdfd73fbaa..2d172f6b8cf 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -900,6 +900,9 @@ internal object CheckIncompatibleTypeVariableUpperBounds : ResolutionPart() { markCandidateForCompatibilityResolve(needToReportWarning = false) continue } + (variableWithConstraints.typeVariable as? TypeVariableFromCallableDescriptor)?.originalTypeParameter?.let { parameter -> + resolvedCall.typeArgumentMappingByOriginal.getTypeArgument(parameter) + } is SimpleTypeArgument -> continue else -> { val emptyIntersectionTypeInfo = constraintSystem.getEmptyIntersectionTypeKind(upperTypes) ?: continue val isInferredEmptyIntersectionForbidden = callComponents.languageVersionSettings.supportsFeature( diff --git a/compiler/testData/diagnostics/tests/inference/kt50232a.fir.kt b/compiler/testData/diagnostics/tests/inference/kt50232a.fir.kt index a5a78826537..cfa03633fd0 100644 --- a/compiler/testData/diagnostics/tests/inference/kt50232a.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/kt50232a.fir.kt @@ -1,5 +1,5 @@ fun test() { - acceptMyRecursive(inferType<MyRecursive?>()) + acceptMyRecursive(inferType<MyRecursive?>()) } fun acceptMyRecursive(value: MyRecursive?) {} diff --git a/compiler/testData/diagnostics/tests/inference/kt50232a.kt b/compiler/testData/diagnostics/tests/inference/kt50232a.kt index 88a7e3922aa..aac5109555d 100644 --- a/compiler/testData/diagnostics/tests/inference/kt50232a.kt +++ b/compiler/testData/diagnostics/tests/inference/kt50232a.kt @@ -1,5 +1,5 @@ fun test() { - acceptMyRecursive(inferType<MyRecursive?>()) + acceptMyRecursive(inferType<MyRecursive?>()) } fun acceptMyRecursive(value: MyRecursive?) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/greater.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/greater.fir.kt index c35bfb899a3..b8a49a48691 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/greater.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/greater.fir.kt @@ -8,5 +8,5 @@ fun , S : T?> Expression.greater(other: T): GreaterOp = fun foo(countExpr: Expression) { countExpr.greater(0) countExpr.greater("0") - countExpr.greater("0") + countExpr.greater("0") }