Inline: Fix operand stack type verify error
This is a proposal to fix KT-49364. Operand stack type verification happens before `checkcast` is executed. When we implicitly cast an inline class to a non-inline type, if type of stack value is not subtype of the target, then coercing is necessary.
This commit is contained in:
+6
@@ -21287,6 +21287,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("implicitCastToNonValueClassType.kt")
|
||||||
|
public void testImplicitCastToNonValueClassType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/implicitCastToNonValueClassType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("initBlock.kt")
|
@TestMetadata("initBlock.kt")
|
||||||
public void testInitBlock() throws Exception {
|
public void testInitBlock() throws Exception {
|
||||||
|
|||||||
+7
@@ -38,6 +38,13 @@ abstract class PromisedValue(val codegen: ExpressionCodegen, val type: Type, val
|
|||||||
if (isFromTypeUnboxed && !isToTypeUnboxed) {
|
if (isFromTypeUnboxed && !isToTypeUnboxed) {
|
||||||
val boxed = typeMapper.mapType(erasedSourceType, TypeMappingMode.CLASS_DECLARATION)
|
val boxed = typeMapper.mapType(erasedSourceType, TypeMappingMode.CLASS_DECLARATION)
|
||||||
StackValue.boxInlineClass(type, boxed, erasedSourceType.isNullable(), mv)
|
StackValue.boxInlineClass(type, boxed, erasedSourceType.isNullable(), mv)
|
||||||
|
|
||||||
|
if (typeMapper.mapType(erasedTargetType) == target) {
|
||||||
|
if (!erasedSourceType.isSubtypeOf(erasedTargetType, codegen.context.typeSystem)) {
|
||||||
|
StackValue.coerce(boxed, target, mv, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!isFromTypeUnboxed && isToTypeUnboxed) {
|
if (!isFromTypeUnboxed && isToTypeUnboxed) {
|
||||||
|
|||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
try {
|
||||||
|
val a:ULong = 1u
|
||||||
|
a as Int
|
||||||
|
func(a)
|
||||||
|
} catch (e: ClassCastException) {
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
return "FAIL"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun func(para: Int) {}
|
||||||
|
|
||||||
|
// CHECK_BYTECODE_TEXT
|
||||||
|
// 1 CHECKCAST java/lang/Integer
|
||||||
|
// 1 L2I
|
||||||
+6
@@ -21287,6 +21287,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("implicitCastToNonValueClassType.kt")
|
||||||
|
public void testImplicitCastToNonValueClassType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/implicitCastToNonValueClassType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("initBlock.kt")
|
@TestMetadata("initBlock.kt")
|
||||||
public void testInitBlock() throws Exception {
|
public void testInitBlock() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user