From fd7559893ea7b76935743f523928e2afa02ec1c1 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Fri, 9 Dec 2022 18:14:42 +0100 Subject: [PATCH] Fix deserialization exception for DNN types from Java useCorrectedNullabilityForTypeParameters = true only might lead to something becomes a DNN when otherwise it wasn't. It seems safe to use it here, since if compiler has generated DNN, then it's OK to assume that it checked necessary conditions, and it's likely that it had useCorrectedNullabilityForTypeParameters = true as well, there. Anyway, it looks saner than having an exception here. Also, we assume here that metadata leading to exception might only be generated with ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated LF (at least, we don't have contradicting evidences), thus it's mostly a preparations in case we decide to enable ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated in 1.9. ^KT-55357 Fixed ^KT-55388 Related ^KT-36770 Related --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../box/javaInterop/delegationToJavaDnn.kt | 29 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../deserialization/TypeDeserializer.kt | 3 +- 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index cd3cd3151c4..53a3c943de5 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -28369,6 +28369,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/javaInterop/conflictingOverloadsForThrowableInheritors2.kt"); } + @Test + @TestMetadata("delegationToJavaDnn.kt") + public void testDelegationToJavaDnn() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt"); + } + @Test @TestMetadata("genericSamProjectedOut.kt") public void testGenericSamProjectedOut() throws Exception { diff --git a/compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt b/compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt new file mode 100644 index 00000000000..9691aa792af --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt @@ -0,0 +1,29 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated +// ISSUE: KT-55357 + +// MODULE: lib +// FILE: J.java +import org.jetbrains.annotations.NotNull; + +public interface J { + @NotNull + T foo(); +} + +// FILE: JImpl.java +public class JImpl implements J { + public T foo() { + return (T) "OK"; + } +} +// FILE: a.kt +class C(val x: J) : J by x + +// MODULE: main(lib) +// FILE: a.kt + +fun box(): String { + return C(JImpl()).foo() +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 8823135d0a9..64e592180ac 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -27439,6 +27439,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/conflictingOverloadsForThrowableInheritors2.kt"); } + @Test + @TestMetadata("delegationToJavaDnn.kt") + public void testDelegationToJavaDnn() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt"); + } + @Test @TestMetadata("genericSamProjectedOut.kt") public void testGenericSamProjectedOut() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 2bad376475a..15b8e6c323a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -28369,6 +28369,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/conflictingOverloadsForThrowableInheritors2.kt"); } + @Test + @TestMetadata("delegationToJavaDnn.kt") + public void testDelegationToJavaDnn() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt"); + } + @Test @TestMetadata("genericSamProjectedOut.kt") public void testGenericSamProjectedOut() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 41b243e59c8..e8e5a1f904d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23157,6 +23157,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/conflictingOverloadsForThrowableInheritors2.kt"); } + @TestMetadata("delegationToJavaDnn.kt") + public void testDelegationToJavaDnn() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/delegationToJavaDnn.kt"); + } + @TestMetadata("genericSamProjectedOut.kt") public void testGenericSamProjectedOut() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOut.kt"); diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt index 800fca608f6..578e92ade62 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt @@ -125,7 +125,8 @@ class TypeDeserializer( else -> KotlinTypeFactory.simpleType(attributes, constructor, arguments, proto.nullable).let { if (Flags.DEFINITELY_NOT_NULL_TYPE.get(proto.flags)) - DefinitelyNotNullType.makeDefinitelyNotNull(it) ?: error("null DefinitelyNotNullType for '$it'") + DefinitelyNotNullType.makeDefinitelyNotNull(it, useCorrectedNullabilityForTypeParameters = true) + ?: error("null DefinitelyNotNullType for '$it'") else it }