JVM IR: do not optimize casts for primitives in TypeOperatorLowering

#KT-48659 Fixed
This commit is contained in:
Alexander Udalov
2021-09-09 00:07:59 +02:00
parent 64827d03bc
commit 64b911ea5e
6 changed files with 51 additions and 1 deletions
@@ -28824,6 +28824,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt");
}
@Test
@TestMetadata("kt48659_identityEqualsWithCastToAny.kt")
public void testKt48659_identityEqualsWithCastToAny() throws Exception {
runTest("compiler/testData/codegen/box/primitiveTypes/kt48659_identityEqualsWithCastToAny.kt");
}
@Test
@TestMetadata("kt518.kt")
public void testKt518() throws Exception {
@@ -100,7 +100,8 @@ private class TypeOperatorLowering(private val context: JvmBackendContext) : Fil
)
}
}
argument.type.isSubtypeOfClass(type.erasedUpperBound.symbol) ->
// Do not optimize casts for values of primitive types because it can affect their identity and thus change behavior.
!argument.type.isPrimitiveType() && argument.type.isSubtypeOfClass(type.erasedUpperBound.symbol) ->
argument
else ->
builder.irAs(argument, type)
@@ -0,0 +1,26 @@
// TARGET_BACKEND: JVM
fun int(a: Int, b: Int): Boolean = (a as Any) === (b as Any)
fun short(a: Short, b: Short): Boolean = (a as Any) === (b as Any)
fun char(a: Char, b: Char): Boolean = (a as Any) === (b as Any)
fun long(a: Long, b: Long): Boolean = (a as Any) === (b as Any)
fun float(a: Float, b: Float): Boolean = (a as Any) === (b as Any)
fun double(a: Double, b: Double): Boolean = (a as Any) === (b as Any)
fun byte(a: Byte, b: Byte): Boolean = (a as Any) === (b as Any)
fun boolean(a: Boolean, b: Boolean): Boolean = (a as Any) === (b as Any)
fun box(): String {
if (int(2021, 2021)) return "Fail int"
if (short(32042, 32042)) return "Fail short"
if (char(4242.toChar(), 4242.toChar())) return "Fail char"
if (long(4242424242L, 4242424242L)) return "Fail long"
if (float(3.14f, 3.14f)) return "Fail float"
if (double(2.72, 2.72)) return "Fail double"
// All byte and boolean values are cached in java.lang.Byte/Boolean.valueOf
if (!byte(127, 127)) return "Fail byte"
if (!boolean(true, true)) return "Fail boolean"
return "OK"
}
@@ -28692,6 +28692,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt");
}
@Test
@TestMetadata("kt48659_identityEqualsWithCastToAny.kt")
public void testKt48659_identityEqualsWithCastToAny() throws Exception {
runTest("compiler/testData/codegen/box/primitiveTypes/kt48659_identityEqualsWithCastToAny.kt");
}
@Test
@TestMetadata("kt518.kt")
public void testKt518() throws Exception {
@@ -28824,6 +28824,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt");
}
@Test
@TestMetadata("kt48659_identityEqualsWithCastToAny.kt")
public void testKt48659_identityEqualsWithCastToAny() throws Exception {
runTest("compiler/testData/codegen/box/primitiveTypes/kt48659_identityEqualsWithCastToAny.kt");
}
@Test
@TestMetadata("kt518.kt")
public void testKt518() throws Exception {
@@ -24375,6 +24375,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt");
}
@TestMetadata("kt48659_identityEqualsWithCastToAny.kt")
public void testKt48659_identityEqualsWithCastToAny() throws Exception {
runTest("compiler/testData/codegen/box/primitiveTypes/kt48659_identityEqualsWithCastToAny.kt");
}
@TestMetadata("kt518.kt")
public void testKt518() throws Exception {
runTest("compiler/testData/codegen/box/primitiveTypes/kt518.kt");