diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inlineClassesCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inlineClassesCodegenUtil.kt index 64945f6bdb5..3c4754923a8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inlineClassesCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inlineClassesCodegenUtil.kt @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.codegen.state.GenerationState -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder @@ -44,6 +41,10 @@ fun CallableDescriptor.isGenericParameter(): Boolean { fun classFileContainsMethod(descriptor: FunctionDescriptor, state: GenerationState, method: Method): Boolean? { if (descriptor !is DeserializedSimpleFunctionDescriptor) return null + if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + return descriptor.overriddenDescriptors.any { classFileContainsMethod(it, state, method) == true } + } + val classId: ClassId = when { descriptor.containingDeclaration is DeserializedClassDescriptor -> { (descriptor.containingDeclaration as DeserializedClassDescriptor).classId ?: return null diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java index 1f28a59acc0..19dc082737c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java @@ -153,6 +153,11 @@ public class FirCompileKotlinAgainstKotlinTestGenerated extends AbstractFirCompi runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); } + @TestMetadata("inlineClassFakeOverrideMangling.kt") + public void testInlineClassFakeOverrideMangling() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt b/compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt new file mode 100644 index 00000000000..b5f77ab6073 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt @@ -0,0 +1,22 @@ +// !LANGUAGE: +InlineClasses + +// FILE: 1.kt + +inline class IC(val s: String) + +abstract class A { + fun foo(s: String) = IC(s) +} + +open class C : A() + +class D: C() + +// FILE: 2.kt + +fun box(): String { + var res = C().foo("OK").s + if (res != "OK") return "FAIL 1 $res" + res = D().foo("OK").s + return res +} diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index 334e1f82531..7d17c880e71 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -158,6 +158,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); } + @TestMetadata("inlineClassFakeOverrideMangling.kt") + public void testInlineClassFakeOverrideMangling() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java index a7fcd65d271..17e2689dd24 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java @@ -153,6 +153,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); } + @TestMetadata("inlineClassFakeOverrideMangling.kt") + public void testInlineClassFakeOverrideMangling() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java index b00353dd020..216c3c86fab 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java @@ -153,6 +153,11 @@ public class JvmIrAgainstOldBoxTestGenerated extends AbstractJvmIrAgainstOldBoxT runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); } + @TestMetadata("inlineClassFakeOverrideMangling.kt") + public void testInlineClassFakeOverrideMangling() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java index 0ac43e5c1dc..29e0050ee99 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java @@ -153,6 +153,11 @@ public class JvmOldAgainstIrBoxTestGenerated extends AbstractJvmOldAgainstIrBoxT runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); } + @TestMetadata("inlineClassFakeOverrideMangling.kt") + public void testInlineClassFakeOverrideMangling() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");