diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt index f0b43dab6de..963c983653e 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt @@ -225,13 +225,13 @@ class SerializationJvmIrIntrinsicSupport( * * Operation detection in new compilers performed by voidMagicApiCall. */ - private fun InstructionAdapter.putReifyMarkerIfNeeded(type: KotlinTypeMarker, intrinsicType: IntrinsicType): Boolean = + private fun InstructionAdapter.putReifyMarkerIfNeeded(type: IrType, intrinsicType: IntrinsicType): Boolean = with(typeSystemContext) { val typeDescriptor = type.typeConstructor().getTypeParameterClassifier() if (typeDescriptor != null) { // need further reification ReifiedTypeInliner.putReifiedOperationMarkerIfNeeded( typeDescriptor, - false, + type.isMarkedNullable(), ReifiedTypeInliner.OperationKind.TYPE_OF, this@putReifyMarkerIfNeeded, typeSystemContext diff --git a/plugins/kotlinx-serialization/testData/boxIr/intrinsicsNullable.kt b/plugins/kotlinx-serialization/testData/boxIr/intrinsicsNullable.kt new file mode 100644 index 00000000000..f005c4aa559 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/boxIr/intrinsicsNullable.kt @@ -0,0 +1,49 @@ +// TARGET_BACKEND: JVM_IR + +// WITH_STDLIB + +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlinx.serialization.internal.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.modules.* +import java.lang.AssertionError + +inline fun listOfNullable(): KSerializer> = serializer>() +inline fun listOfNullableWithNonNullBound(): KSerializer> = serializer>() +inline fun listOfNullableNoExplicitBound(): KSerializer> = serializer>() +inline fun listOfNullableWithCast(): KSerializer> = serializer>() as KSerializer> +inline fun listOfUnspecifiedNullability(): KSerializer> = serializer>() + +inline fun getSer(module: SerializersModule): KSerializer { + return module.serializer() +} + +fun check(shouldBeNullable: Boolean, descriptor: SerialDescriptor) { + if (shouldBeNullable == descriptor.isNullable) return + if (shouldBeNullable) throw java.lang.AssertionError("Should be nullable, but is not: $descriptor") + throw java.lang.AssertionError("Should not be nullable, but it is: $descriptor") +} + +fun box(): String { + check(false, serializer().descriptor) + check(true, serializer().descriptor) + + check(false, serializer>().descriptor.elementDescriptors.first()) + check(true, serializer>().descriptor.elementDescriptors.first()) + check(true, serializer?>().descriptor) + + check(true, listOfNullable().descriptor.elementDescriptors.first()) + check(true, listOfNullableNoExplicitBound().descriptor.elementDescriptors.first()) + check(true, listOfNullableWithNonNullBound().descriptor.elementDescriptors.first()) + check(true, listOfNullableWithCast().descriptor.elementDescriptors.first()) + + check(false, listOfUnspecifiedNullability().descriptor.elementDescriptors.first()) + check(true, listOfUnspecifiedNullability().descriptor.elementDescriptors.first()) + + val module = EmptySerializersModule() + check(false, getSer(module).descriptor) + check(true, getSer(module).descriptor) + + return "OK" +} diff --git a/plugins/kotlinx-serialization/testData/boxIr/intrinsicsStarProjections.kt b/plugins/kotlinx-serialization/testData/boxIr/intrinsicsStarProjections.kt index e71ce33dd18..ed1afcb248c 100644 --- a/plugins/kotlinx-serialization/testData/boxIr/intrinsicsStarProjections.kt +++ b/plugins/kotlinx-serialization/testData/boxIr/intrinsicsStarProjections.kt @@ -47,4 +47,4 @@ fun box(): String { getListSer>() } return "OK" -} \ No newline at end of file +} diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java index 0d9fe0da0a0..ed7befd0d05 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java @@ -135,6 +135,12 @@ public class SerializationFirLightTreeBlackBoxTestGenerated extends AbstractSeri runTest("plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt"); } + @Test + @TestMetadata("intrinsicsNullable.kt") + public void testIntrinsicsNullable() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/intrinsicsNullable.kt"); + } + @Test @TestMetadata("intrinsicsStarProjections.kt") public void testIntrinsicsStarProjections() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java index 2d2fa527aaf..9f48ddb9078 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java @@ -133,6 +133,12 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT runTest("plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt"); } + @Test + @TestMetadata("intrinsicsNullable.kt") + public void testIntrinsicsNullable() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/intrinsicsNullable.kt"); + } + @Test @TestMetadata("intrinsicsStarProjections.kt") public void testIntrinsicsStarProjections() throws Exception {