[JVM IR] Fix constant folding to use basic types always.
Fixes KT-46540.
This commit is contained in:
committed by
Alexander Udalov
parent
ad18d5984b
commit
2c5a4dcb98
+6
@@ -15566,6 +15566,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46540.kt")
|
||||||
|
public void testKt46540() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/fullJdk/kt46540.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
||||||
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
||||||
|
|||||||
+10
-11
@@ -105,18 +105,17 @@ class FoldConstantLowering(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun buildIrConstant(startOffset: Int, endOffset: Int, type: IrType, v: Any?): IrConst<*> {
|
private fun buildIrConstant(startOffset: Int, endOffset: Int, type: IrType, v: Any?): IrConst<*> {
|
||||||
val constType = type.makeNotNull()
|
|
||||||
return when (type.getPrimitiveType()) {
|
return when (type.getPrimitiveType()) {
|
||||||
PrimitiveType.BOOLEAN -> IrConstImpl.boolean(startOffset, endOffset, constType, v as Boolean)
|
PrimitiveType.BOOLEAN -> IrConstImpl.boolean(startOffset, endOffset, context.irBuiltIns.booleanType, v as Boolean)
|
||||||
PrimitiveType.CHAR -> IrConstImpl.char(startOffset, endOffset, constType, v as Char)
|
PrimitiveType.CHAR -> IrConstImpl.char(startOffset, endOffset, context.irBuiltIns.charType, v as Char)
|
||||||
PrimitiveType.BYTE -> IrConstImpl.byte(startOffset, endOffset, constType, (v as Number).toByte())
|
PrimitiveType.BYTE -> IrConstImpl.byte(startOffset, endOffset, context.irBuiltIns.byteType, (v as Number).toByte())
|
||||||
PrimitiveType.SHORT -> IrConstImpl.short(startOffset, endOffset, constType, (v as Number).toShort())
|
PrimitiveType.SHORT -> IrConstImpl.short(startOffset, endOffset, context.irBuiltIns.shortType, (v as Number).toShort())
|
||||||
PrimitiveType.INT -> IrConstImpl.int(startOffset, endOffset, constType, (v as Number).toInt())
|
PrimitiveType.INT -> IrConstImpl.int(startOffset, endOffset, context.irBuiltIns.intType, (v as Number).toInt())
|
||||||
PrimitiveType.FLOAT -> fromFloatConstSafe(startOffset, endOffset, type, v)
|
PrimitiveType.FLOAT -> fromFloatConstSafe(startOffset, endOffset, context.irBuiltIns.floatType, v)
|
||||||
PrimitiveType.LONG -> IrConstImpl.long(startOffset, endOffset, constType, (v as Number).toLong())
|
PrimitiveType.LONG -> IrConstImpl.long(startOffset, endOffset, context.irBuiltIns.longType, (v as Number).toLong())
|
||||||
PrimitiveType.DOUBLE -> IrConstImpl.double(startOffset, endOffset, constType, (v as Number).toDouble())
|
PrimitiveType.DOUBLE -> IrConstImpl.double(startOffset, endOffset, context.irBuiltIns.doubleType, (v as Number).toDouble())
|
||||||
else -> when {
|
else -> when {
|
||||||
constType.isString() -> IrConstImpl.string(startOffset, endOffset, constType, v as String)
|
type.isStringClassType() -> IrConstImpl.string(startOffset, endOffset, context.irBuiltIns.stringType, v as String)
|
||||||
else -> throw IllegalArgumentException("Unexpected IrCall return type")
|
else -> throw IllegalArgumentException("Unexpected IrCall return type")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,4 +288,4 @@ class FoldConstantLowering(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// SKIP_JDK6
|
||||||
|
// FULL_JDK
|
||||||
|
|
||||||
|
import java.util.function.Supplier
|
||||||
|
|
||||||
|
class A {
|
||||||
|
val xLong: Supplier<Long>
|
||||||
|
get() = Supplier { 30 * 30 }
|
||||||
|
|
||||||
|
val xShort: Supplier<Short>
|
||||||
|
get() = Supplier { 30 * 30 }
|
||||||
|
|
||||||
|
val xInt: Supplier<Int>
|
||||||
|
get() = Supplier { 30 * 30 }
|
||||||
|
|
||||||
|
val xByte: Supplier<Byte>
|
||||||
|
get() = Supplier { 3 * 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val a = A()
|
||||||
|
if (a.xLong.get() != 900L) return "FAIL1"
|
||||||
|
var expectedShort: Short = 900
|
||||||
|
if (a.xShort.get() != expectedShort) return "FAIL2"
|
||||||
|
if (a.xInt.get() != 900) return "FAIL3"
|
||||||
|
val expectedByte: Byte = 9
|
||||||
|
if (a.xByte.get() != expectedByte) return "FAIL4"
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -15542,6 +15542,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46540.kt")
|
||||||
|
public void testKt46540() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/fullJdk/kt46540.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
||||||
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
||||||
|
|||||||
+6
@@ -15566,6 +15566,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46540.kt")
|
||||||
|
public void testKt46540() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/fullJdk/kt46540.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
||||||
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
||||||
|
|||||||
+5
@@ -12797,6 +12797,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
runTest("compiler/testData/codegen/box/fullJdk/kt434.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46540.kt")
|
||||||
|
public void testKt46540() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/fullJdk/kt46540.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
@TestMetadata("platformTypeAssertionStackTrace.kt")
|
||||||
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
public void testPlatformTypeAssertionStackTrace() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/fullJdk/platformTypeAssertionStackTrace.kt");
|
runTest("compiler/testData/codegen/box/fullJdk/platformTypeAssertionStackTrace.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user