Fix mapping of platform inline class types

For the inline class:
 ```
 inline class IC(val x: Int)
 ```

 Type (IC..IC?) should be mapped to the wrapper `IC`
 because it can hold object and also because it does so for primitives

 #KT-28983 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2018-12-23 20:24:22 +03:00
parent 7c9ca99388
commit e509649132
6 changed files with 85 additions and 1 deletions
+19
View File
@@ -0,0 +1,19 @@
// WITH_REFLECT
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM_IR
import java.util.concurrent.atomic.AtomicReference
import java.util.Arrays
fun box(): String {
val a0 = AtomicReference(0.toUByte()).get().javaClass
val a1 = AtomicReference(0u).get().javaClass
val b = Arrays.asList(42u).first().javaClass
if (a0.toString() != "class kotlin.UByte") return "Fail 1"
if (a1.toString() != "class kotlin.UInt") return "Fail 2"
if (b.toString() != "class kotlin.UInt") return "Fail 3"
return "OK"
}
@@ -0,0 +1,35 @@
// WITH_RUNTIME
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM_IR
// FILE: JavaClass.java
public class JavaClass {
public static <T> T id(T x) { return x; }
}
// FILE: test.kt
inline class IcInt(val i: Int)
inline class IcLong(val l: Long)
inline class IcAny(val a: Any?)
inline class IcOverIc(val o: IcInt)
fun box(): String {
val i = IcInt(1)
val l = IcLong(2)
val a = IcAny("string")
val o = IcOverIc(IcInt(3))
val ij = JavaClass.id(i)
val lj = JavaClass.id(l)
val aj = JavaClass.id(a)
val oj = JavaClass.id(o)
if (ij.i != 1) return "Fail 1"
if (lj.l != 2L) return "Fail 2"
if (aj.a != "string") return "Fail 3"
if (oj.o.i != 3) return "Fail 4"
return "OK"
}
@@ -12145,11 +12145,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt");
}
@TestMetadata("kt28879.kt")
public void testKt28879() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/kt28879.kt");
}
@TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt")
public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");
}
@TestMetadata("mappingOfBoxedFlexibleInlineClassType.kt")
public void testMappingOfBoxedFlexibleInlineClassType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/mappingOfBoxedFlexibleInlineClassType.kt");
}
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
@@ -12145,11 +12145,21 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt");
}
@TestMetadata("kt28879.kt")
public void testKt28879() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/kt28879.kt");
}
@TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt")
public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");
}
@TestMetadata("mappingOfBoxedFlexibleInlineClassType.kt")
public void testMappingOfBoxedFlexibleInlineClassType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/mappingOfBoxedFlexibleInlineClassType.kt");
}
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
@@ -12150,11 +12150,21 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt");
}
@TestMetadata("kt28879.kt")
public void testKt28879() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/kt28879.kt");
}
@TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt")
public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");
}
@TestMetadata("mappingOfBoxedFlexibleInlineClassType.kt")
public void testMappingOfBoxedFlexibleInlineClassType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/mappingOfBoxedFlexibleInlineClassType.kt");
}
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
@@ -284,7 +284,7 @@ internal fun computeExpandedTypeInner(kotlinType: KotlinType, visitedClassifiers
val underlyingType = kotlinType.substitutedUnderlyingType() ?: return null
val expandedUnderlyingType = computeExpandedTypeInner(underlyingType, visitedClassifiers) ?: return null
when {
!kotlinType.isMarkedNullable -> expandedUnderlyingType
!kotlinType.isNullable() -> expandedUnderlyingType
// Here inline class type is nullable. Apply nullability to the expandedUnderlyingType.