diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index bcdcca65313..ecde64e6e67 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -24,10 +24,10 @@ import org.jetbrains.kotlin.backend.common.reportWarning import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke import org.jetbrains.kotlin.backend.konan.descriptors.needsInlining +import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor import org.jetbrains.kotlin.backend.konan.descriptors.resolveFakeOverride import org.jetbrains.kotlin.backend.konan.ir.DeserializerDriver import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.ir.IrElement @@ -211,12 +211,12 @@ private class Inliner(val globalSubstituteMap: MutableMap - typeParameter.typeConstructor to TypeProjectionImpl(typeArgument) + val descriptor = irCall.descriptor.resolveFakeOverride().original + val typeParameters = descriptor.propertyIfAccessor.typeParameters + val substitutionContext = typeArgumentsMap.entries.associate { (typeParameter, typeArgument) -> + typeParameters[typeParameter.index].typeConstructor to TypeProjectionImpl(typeArgument) } return TypeSubstitutor.create(substitutionContext) } diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 2325de7c175..16983889286 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2086,6 +2086,11 @@ task inline26(type: RunKonanTest) { source = "codegen/inline/inline26.kt" } +task inline_type_substitution_in_fake_override(type: RunKonanTest) { + goldValue = "OK\n" + source = "codegen/inline/typeSubstitutionInFakeOverride.kt" +} + task deserialized_inline0(type: RunKonanTest) { source = "serialization/deserialized_inline0.kt" } diff --git a/backend.native/tests/codegen/inline/typeSubstitutionInFakeOverride.kt b/backend.native/tests/codegen/inline/typeSubstitutionInFakeOverride.kt new file mode 100644 index 00000000000..412bca506b9 --- /dev/null +++ b/backend.native/tests/codegen/inline/typeSubstitutionInFakeOverride.kt @@ -0,0 +1,21 @@ +package codegen.inline.typeSubstitutionInFakeOverride + +import kotlin.test.* + +abstract class A { + inline fun baz(): String { + return T::class.simpleName!! + } +} + +class B : A() { + fun bar(): String { + return baz() + } +} + +class OK + +@Test fun runTest() { + println(B().bar()) +} \ No newline at end of file