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 4e49afac2c4..a17c41fc7b2 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 @@ -32575,6 +32575,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/when/whenAndLambdaWithExpectedType.kt"); } + @Test + @TestMetadata("whenOnClass.kt") + public void testWhenOnClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOnClass.kt"); + } + @Test @TestMetadata("whenOnNothing.kt") public void testWhenOnNothing() 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 7dccaf56f71..4c30206fec2 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 @@ -32575,6 +32575,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/when/whenAndLambdaWithExpectedType.kt"); } + @Test + @TestMetadata("whenOnClass.kt") + public void testWhenOnClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOnClass.kt"); + } + @Test @TestMetadata("whenOnNothing.kt") public void testWhenOnNothing() 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 64e3f59cc50..c7aac8c8c48 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 @@ -32575,6 +32575,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/when/whenAndLambdaWithExpectedType.kt"); } + @Test + @TestMetadata("whenOnClass.kt") + public void testWhenOnClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOnClass.kt"); + } + @Test @TestMetadata("whenOnNothing.kt") public void testWhenOnNothing() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt index 573dbefac56..3f693ad61bb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.Variance @@ -45,6 +46,8 @@ import org.jetbrains.kotlin.types.Variance */ object ConeTypeCompatibilityChecker { + private val javaClassClassId = ClassId.fromString("java/lang/Class") + /** * The result returned by [ConeTypeCompatibilityChecker]. Note the order of enum entries matters. */ @@ -146,6 +149,9 @@ object ConeTypeCompatibilityChecker { if (upperBounds.size < 2) return Compatibility.COMPATIBLE + // TODO: Due to KT-49358, we skip any checks on Java class. + if (upperBounds.any { it.classId == javaClassClassId }) return Compatibility.COMPATIBLE + // Base types are compatible. Now we check type parameters. val typeArgumentMapping = mutableMapOf().apply { diff --git a/compiler/testData/diagnostics/tests/when/whenOnClass.kt b/compiler/testData/diagnostics/tests/when/whenOnClass.kt new file mode 100644 index 00000000000..bcb077a08db --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/whenOnClass.kt @@ -0,0 +1,32 @@ +// FIR_IDENTICAL +// FULL_JDK +// WITH_RUNTIME +// WITH_REFLECT + +interface A +interface B : A +interface C + +fun test1(a: A) { + when (a.javaClass) { + A::class.java -> {} + B::class.java -> {} + C::class.java -> {} + Any::class.java -> {} + else -> {} + } +} + +class Foo : B +class Bar + +fun test2(f: Foo) { + when (f.javaClass) { + Foo::class.java -> {} + Bar::class.java -> {} + A::class.java -> {} + B::class.java -> {} + C::class.java -> {} + Any::class.java -> {} + } +} diff --git a/compiler/testData/diagnostics/tests/when/whenOnClass.txt b/compiler/testData/diagnostics/tests/when/whenOnClass.txt new file mode 100644 index 00000000000..961af90149a --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/whenOnClass.txt @@ -0,0 +1,36 @@ +package + +public fun test1(/*0*/ a: A): kotlin.Unit +public fun test2(/*0*/ f: Foo): kotlin.Unit + +public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B : A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar { + public constructor Bar() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface C { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo : B { + public constructor Foo() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} 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 e45842baca8..dbe2b35d91f 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 @@ -32671,6 +32671,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/when/whenAndLambdaWithExpectedType.kt"); } + @Test + @TestMetadata("whenOnClass.kt") + public void testWhenOnClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOnClass.kt"); + } + @Test @TestMetadata("whenOnNothing.kt") public void testWhenOnNothing() throws Exception {