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 9212c8f3a80..e9e7a01784e 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 @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass import org.jetbrains.kotlin.fir.declarations.utils.isFinal import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isInterface -import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.expressions.FirOperation -import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression +import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.isPrimitiveType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol @@ -38,8 +35,8 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() { val arguments = expression.argumentList.arguments require(arguments.size == 2) { "Equality operator call with non-2 arguments" } - val l = arguments[0].toArgumentInfo(context) - val r = arguments[1].toArgumentInfo(context) + val l = arguments[0].unwrapToMoreUsefulExpression().toArgumentInfo(context) + val r = arguments[1].unwrapToMoreUsefulExpression().toArgumentInfo(context) checkSenselessness(l.smartCastType, r.smartCastType, context, expression, reporter) @@ -81,6 +78,11 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() { } } + private fun FirExpression.unwrapToMoreUsefulExpression() = when (this) { + is FirWhenSubjectExpression -> whenRef.value.subject ?: this + else -> this + } + private fun checkEqualityApplicability(l: TypeInfo, r: TypeInfo, context: CheckerContext): Applicability { val oneIsBuiltin = l.isBuiltin || r.isBuiltin val oneIsIdentityLess = l.isIdentityLess || r.isIdentityLess diff --git a/compiler/testData/diagnostics/testsWithStdLib/comparingSmartCastValueToBoolean.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/comparingSmartCastValueToBoolean.fir.kt index 626a2dee319..1a8dc44e2ea 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/comparingSmartCastValueToBoolean.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/comparingSmartCastValueToBoolean.fir.kt @@ -9,7 +9,7 @@ fun foo(a: Any) { } when (a) { - a == 1 -> print("1") + a == 1 -> print("1") } if ((a as A) == (a == 1)) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt index ea29323b468..5612209d2a5 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/equalityCompatibilityCommonCases.fir.kt @@ -53,7 +53,7 @@ fun incompatibleTypes(a: Int) = when(a) { fun incompatibleTypesSmartCast(a: Any?) { if (a is Int) { when(a) { - C(10) -> 1 + C(10) -> 1 else -> 2 } }