Skip to content

Commit c7b7cee

Browse files
merfemorSpace Team
authored andcommitted
[FIR] Fix missing diagnostics about identity-sensitive operations
...on flexible primitive types. ^KT-76984 Fixed
1 parent 524070c commit c7b7cee

File tree

4 files changed

+16
-3
lines changed

4 files changed

+16
-3
lines changed

compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmIdentitySensitiveCallWithValueTypeObjectChecker.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@
55

66
package org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression
77

8+
import org.jetbrains.kotlin.config.LanguageFeature
89
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
910
import org.jetbrains.kotlin.diagnostics.reportOn
1011
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
1112
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1213
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker
1314
import org.jetbrains.kotlin.fir.analysis.checkers.isValueClass
1415
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
16+
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.IDENTITY_SENSITIVE_OPERATIONS_WITH_VALUE_TYPE
1517
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_BLOCK_ON_JAVA_VALUE_BASED_CLASS
1618
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_BLOCK_ON_VALUE_CLASS_OR_PRIMITIVE
1719
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
1820
import org.jetbrains.kotlin.fir.expressions.argument
1921
import org.jetbrains.kotlin.fir.expressions.arguments
2022
import org.jetbrains.kotlin.fir.expressions.resolvedArgumentMapping
23+
import org.jetbrains.kotlin.fir.languageVersionSettings
2124
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
2225
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
2326
import org.jetbrains.kotlin.fir.types.coneType
@@ -86,6 +89,11 @@ object FirJvmIdentitySensitiveCallWithValueTypeObjectChecker : FirFunctionCallCh
8689
if (type.isJavaValueBasedClassAndWarningsEnabled(context.session)) {
8790
reporter.reportOn(argument.source, SYNCHRONIZED_BLOCK_ON_JAVA_VALUE_BASED_CLASS, type, context)
8891
}
92+
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.DisableWarningsForIdentitySensitiveOperationsOnValueClassesAndPrimitives) &&
93+
type.isFlexiblePrimitive()
94+
) {
95+
reporter.reportOn(argument.source, IDENTITY_SENSITIVE_OPERATIONS_WITH_VALUE_TYPE, type, context)
96+
}
8997
}
9098
}
9199
}

compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/firJavaValueBasedClassUtils.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.isValueClass
1111
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
1212
import org.jetbrains.kotlin.fir.languageVersionSettings
1313
import org.jetbrains.kotlin.fir.resolve.toClassSymbol
14+
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
1415
import org.jetbrains.kotlin.fir.types.ConeKotlinType
1516
import org.jetbrains.kotlin.fir.types.isPrimitiveOrNullablePrimitive
1617
import org.jetbrains.kotlin.name.ClassId
@@ -29,7 +30,11 @@ internal fun ConeKotlinType.isJavaValueBasedClassAndWarningsEnabled(session: Fir
2930

3031
internal fun ConeKotlinType.isValueTypeAndWarningsEnabled(session: FirSession): Boolean {
3132
if (!session.languageVersionSettings.supportsFeature(LanguageFeature.DisableWarningsForIdentitySensitiveOperationsOnValueClassesAndPrimitives) &&
32-
(this.isPrimitiveOrNullablePrimitive || this.isValueClass(session))
33+
(this.isPrimitiveOrNullablePrimitive || this.isValueClass(session) || this.isFlexiblePrimitive())
3334
) return true
3435
return this.isJavaValueBasedClassAndWarningsEnabled(session)
3536
}
37+
38+
internal fun ConeKotlinType.isFlexiblePrimitive(): Boolean {
39+
return this is ConeFlexibleType && lowerBound.isPrimitiveOrNullablePrimitive && upperBound.isPrimitiveOrNullablePrimitive
40+
}

compiler/testData/diagnostics/tests/identitySensitiveOperationsOnValueObjectsWarning.fir.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,5 @@ fun testTypeParameters() {
6767
}
6868

6969
fun testFlexibleTypes() {
70-
System.identityHashCode(Integer.valueOf(1))
70+
System.identityHashCode(<!IDENTITY_SENSITIVE_OPERATIONS_WITH_VALUE_TYPE!>Integer.valueOf(1)<!>)
7171
}

compiler/testData/diagnostics/tests/synchronizedOnJavaValueBasedWarning.fir.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ typealias LocalDateAlias = java.time.LocalDate
1010
fun test(p1: java.time.LocalDate, p2: LocalDateAlias) {
1111
synchronized(<!SYNCHRONIZED_BLOCK_ON_JAVA_VALUE_BASED_CLASS!>p1<!>) { }
1212
synchronized(<!SYNCHRONIZED_BLOCK_ON_JAVA_VALUE_BASED_CLASS!>p2<!>) { }
13-
synchronized(Integer.valueOf(1)) {}
13+
synchronized(<!IDENTITY_SENSITIVE_OPERATIONS_WITH_VALUE_TYPE!>Integer.valueOf(1)<!>) {}
1414
}

0 commit comments

Comments
 (0)