From 0f898dc6dc37fe86e6bd66ae97b23258679bb62b Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 20 Sep 2018 15:28:54 +0300 Subject: [PATCH] Fix default interface generic extension fun call with inline class type When we've determined that we are going to invoke an erased inline class method ('static foo-impl(this, ...)' in inline class), keep track of it so that the remaining type mapping logic proceeds correctly. #KT-26998 Fixed Target versions 1.3.20 --- .../codegen/state/KotlinTypeMapper.java | 5 ++- ...genericDefaultInterfaceExtensionFunCall.kt | 39 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../IrJsCodegenBoxTestGenerated.java | 5 +++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++ 7 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 0801e6d19e8..136f962b460 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -862,6 +862,9 @@ public class KotlinTypeMapper { } else { boolean toInlinedErasedClass = currentOwner.isInline() && !isAccessor(functionDescriptor); + if (toInlinedErasedClass) { + functionDescriptor = descriptor; + } boolean isStaticInvocation = (isStaticDeclaration(functionDescriptor) && !(functionDescriptor instanceof ImportedFromObjectCallableDescriptor)) || @@ -890,7 +893,7 @@ public class KotlinTypeMapper { : functionDescriptor.getOriginal(); signature = toInlinedErasedClass - ? mapSignatureForInlineErasedClassSkipGeneric(descriptor.getOriginal()) + ? mapSignatureForInlineErasedClassSkipGeneric(functionToCall) : mapSignatureSkipGeneric(functionToCall); returnKotlinType = functionToCall.getReturnType(); diff --git a/compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt b/compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt new file mode 100644 index 00000000000..2b7084ed8c1 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt @@ -0,0 +1,39 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +interface IFoo> { + fun T.foo(): String = bar() + fun bar(): String +} + +inline class Z(val x: Int) : IFoo { + override fun bar(): String = "OK" +} + +inline class L(val x: Long) : IFoo { + override fun bar(): String = "OK" +} + +inline class S(val x: String) : IFoo { + override fun bar(): String = x +} + +fun Z.testZ() { + if (Z(42).foo() != "OK") throw AssertionError() +} + +fun L.testL() { + if (L(4L).foo() != "OK") throw AssertionError() +} + +fun S.testS() { + if (S("OK").foo() != "OK") throw AssertionError() +} + +fun box(): String { + Z(42).testZ() + L(4L).testL() + S("").testS() + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 1787a082bae..b3c6f0f1029 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12087,6 +12087,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/defaultInterfaceMethodCall.kt"); } + @TestMetadata("genericDefaultInterfaceExtensionFunCall.kt") + public void testGenericDefaultInterfaceExtensionFunCall() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt"); + } + @TestMetadata("genericDefaultInterfaceMethodCall.kt") public void testGenericDefaultInterfaceMethodCall() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceMethodCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 8b0d01232c7..426298401d0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12087,6 +12087,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/defaultInterfaceMethodCall.kt"); } + @TestMetadata("genericDefaultInterfaceExtensionFunCall.kt") + public void testGenericDefaultInterfaceExtensionFunCall() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt"); + } + @TestMetadata("genericDefaultInterfaceMethodCall.kt") public void testGenericDefaultInterfaceMethodCall() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceMethodCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 474d741fec0..3920f672348 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12092,6 +12092,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/defaultInterfaceMethodCall.kt"); } + @TestMetadata("genericDefaultInterfaceExtensionFunCall.kt") + public void testGenericDefaultInterfaceExtensionFunCall() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt"); + } + @TestMetadata("genericDefaultInterfaceMethodCall.kt") public void testGenericDefaultInterfaceMethodCall() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceMethodCall.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 6340158b6bc..1fcbf5a7446 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10612,6 +10612,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/defaultInterfaceMethodCall.kt"); } + @TestMetadata("genericDefaultInterfaceExtensionFunCall.kt") + public void testGenericDefaultInterfaceExtensionFunCall() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt"); + } + @TestMetadata("genericDefaultInterfaceMethodCall.kt") public void testGenericDefaultInterfaceMethodCall() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceMethodCall.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index acb990ca969..75d2ec266a1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11672,6 +11672,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/defaultInterfaceMethodCall.kt"); } + @TestMetadata("genericDefaultInterfaceExtensionFunCall.kt") + public void testGenericDefaultInterfaceExtensionFunCall() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceExtensionFunCall.kt"); + } + @TestMetadata("genericDefaultInterfaceMethodCall.kt") public void testGenericDefaultInterfaceMethodCall() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/genericDefaultInterfaceMethodCall.kt");