diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrTypeSystemContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrTypeSystemContext.kt index 23451e624f9..7590741d2e6 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrTypeSystemContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrTypeSystemContext.kt @@ -7,15 +7,16 @@ package org.jetbrains.kotlin.backend.jvm import org.jetbrains.kotlin.backend.jvm.ir.IrJvmFlexibleType import org.jetbrains.kotlin.backend.jvm.ir.asJvmFlexibleType +import org.jetbrains.kotlin.backend.jvm.ir.isWithFlexibleMutability import org.jetbrains.kotlin.backend.jvm.ir.isWithFlexibleNullability import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrTypeSystemContext -import org.jetbrains.kotlin.ir.types.isMarkedNullable as irIsMarkedNullable import org.jetbrains.kotlin.types.model.FlexibleTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.SimpleTypeMarker +import org.jetbrains.kotlin.ir.types.isMarkedNullable as irIsMarkedNullable class JvmIrTypeSystemContext(override val irBuiltIns: IrBuiltIns) : IrTypeSystemContext { override fun KotlinTypeMarker.asFlexibleType(): FlexibleTypeMarker? = @@ -37,4 +38,10 @@ class JvmIrTypeSystemContext(override val irBuiltIns: IrBuiltIns) : IrTypeSystem override fun KotlinTypeMarker.isMarkedNullable(): Boolean = this is IrSimpleType && !isWithFlexibleNullability() && irIsMarkedNullable() + + override fun KotlinTypeMarker.isDynamic(): Boolean = + false + + override fun KotlinTypeMarker.isFlexibleWithDifferentTypeConstructors(): Boolean = + (this as IrType).isWithFlexibleMutability() } diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt index 7bc3bfb5331..acfcbafc9dd 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt @@ -513,7 +513,7 @@ object AbstractTypeChecker { private fun TypeSystemContext.isCommonDenotableType(type: KotlinTypeMarker): Boolean = type.typeConstructor().isDenotable() && !type.isDynamic() && !type.isDefinitelyNotNullType() && !type.isNotNullTypeParameter() && - type.lowerBoundIfFlexible().typeConstructor() == type.upperBoundIfFlexible().typeConstructor() + !type.isFlexibleWithDifferentTypeConstructors() fun effectiveVariance(declared: TypeVariance, useSite: TypeVariance): TypeVariance? { if (declared == TypeVariance.INV) return useSite diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index 1bc673a0459..b20a65e71c0 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -448,6 +448,9 @@ interface TypeSystemContext : TypeSystemOptimizationContext { fun KotlinTypeMarker.lowerBoundIfFlexible(): SimpleTypeMarker = this.asFlexibleType()?.lowerBound() ?: this.asSimpleType()!! fun KotlinTypeMarker.upperBoundIfFlexible(): SimpleTypeMarker = this.asFlexibleType()?.upperBound() ?: this.asSimpleType()!! + fun KotlinTypeMarker.isFlexibleWithDifferentTypeConstructors(): Boolean = + lowerBoundIfFlexible().typeConstructor() != upperBoundIfFlexible().typeConstructor() + fun TypeConstructorMarker.isDefinitelyClassTypeConstructor(): Boolean = isClassTypeConstructor() && !isInterface() fun KotlinTypeMarker.isFlexible(): Boolean = asFlexibleType() != null