From 94bb465e62287e906f697070372d03ec8b1b4ed4 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 9 Dec 2021 13:28:28 +0300 Subject: [PATCH] JVM_IR KT-50076 don't null check moved dispatch receiver parameter --- .../runners/codegen/FirBytecodeTextTestGenerated.java | 6 ++++++ .../kotlin/backend/jvm/codegen/ExpressionCodegen.kt | 5 ++++- .../interfaces/noNullCheckOnThisInDefaultMethod.kt | 8 ++++++++ .../test/runners/codegen/BytecodeTextTestGenerated.java | 6 ++++++ .../test/runners/codegen/IrBytecodeTextTestGenerated.java | 6 ++++++ 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java index d97b27224c0..e2cda54efdf 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java @@ -3962,6 +3962,12 @@ public class FirBytecodeTextTestGenerated extends AbstractFirBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/interfaces/noAnyMethodsOnInterfaceInheritance.kt"); } + @Test + @TestMetadata("noNullCheckOnThisInDefaultMethod.kt") + public void testNoNullCheckOnThisInDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt"); + } + @Test @TestMetadata("noPrivateMemberInJavaInterface.kt") public void testNoPrivateMemberInJavaInterface() throws Exception { diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 5d879f67679..7d0867c024e 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -321,7 +321,10 @@ class ExpressionCodegen( irFunction.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA private fun generateNonNullAssertion(param: IrValueParameter) { - if (param.origin == JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS) return + if (param.origin == JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS || + param.origin == IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER + ) + return val asmType = param.type.asmType if (!param.type.unboxInlineClass().isNullable() && !isPrimitive(asmType)) { mv.load(findLocalIndex(param.symbol), asmType) diff --git a/compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt b/compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt new file mode 100644 index 00000000000..3e1494de545 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt @@ -0,0 +1,8 @@ +interface Test { + fun foo() = "abc" + fun String.bar() = "def" +} + +// 1 check +// ^ no null check for dispatch receiver parameters in 'foo' and 'bar', +// extension receiver parameter in 'bar' is checked diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeTextTestGenerated.java index 254fe628b5c..12bea02a010 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeTextTestGenerated.java @@ -3818,6 +3818,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/interfaces/noAnyMethodsOnInterfaceInheritance.kt"); } + @Test + @TestMetadata("noNullCheckOnThisInDefaultMethod.kt") + public void testNoNullCheckOnThisInDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt"); + } + @Test @TestMetadata("noPrivateMemberInJavaInterface.kt") public void testNoPrivateMemberInJavaInterface() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java index 31ee53a3266..3f583db480b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java @@ -3962,6 +3962,12 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/interfaces/noAnyMethodsOnInterfaceInheritance.kt"); } + @Test + @TestMetadata("noNullCheckOnThisInDefaultMethod.kt") + public void testNoNullCheckOnThisInDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/interfaces/noNullCheckOnThisInDefaultMethod.kt"); + } + @Test @TestMetadata("noPrivateMemberInJavaInterface.kt") public void testNoPrivateMemberInJavaInterface() throws Exception {