From c9d7b479008386dc002d9fe1f9c5b090ca8ac7d6 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 19 Apr 2023 14:54:26 +0300 Subject: [PATCH] [FIR] Report `==` for identity-less Since we forbid overriding `equals` for value classes, and value classes may only implement interfaces, we know everything about their `equals`, hence we can guarantee if it always returns `false` for different value classes. --- .../checkers/expression/FirEqualityCompatibilityChecker.kt | 3 ++- .../testsWithStdLib/equalityCompatibilityCommonCases.fir.kt | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt index fb157705367..8dc0661bdcd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt @@ -80,6 +80,7 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() { private fun checkEqualityApplicability(l: TypeInfo, r: TypeInfo, context: CheckerContext): Applicability { val oneIsBuiltin = l.isBuiltin || r.isBuiltin + val oneIsIdentityLess = l.isIdentityLess || r.isIdentityLess // The compiler should only check comparisons // when builtins are involved. @@ -87,7 +88,7 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() { // the list of special fqNames described in RULES1 return when { - oneIsBuiltin && shouldReportAsPerRules1(l, r, context) -> getInapplicabilityFor(l, r) + (oneIsBuiltin || oneIsIdentityLess) && shouldReportAsPerRules1(l, r, context) -> getInapplicabilityFor(l, r) else -> Applicability.APPLICABLE } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt index f817c853084..da89a77159f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt @@ -86,13 +86,13 @@ fun incompatibleIdentityRegardlessNullabilitySmartCast(a: Any?, b: Any?) { } fun incompatibleIdentityRegardlessNullabilityWithValueClasses(c: C?, d: D?) { - c == d + c == d c === d } fun incompatibleIdentityRegardlessNullabilityWithValueClassesSmartCast(c: Any?, d: Any?) { if (c is C? && d is D?) { - c == d + c == d c === d } }