Fixed bug with type projection building + test

Bug could be seen on fake overridden functions calls
This commit is contained in:
Igor Chevdar
2018-01-16 19:41:30 +03:00
parent 77f220f335
commit b2098088ec
3 changed files with 31 additions and 5 deletions
@@ -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<DeclarationDescriptor,
//-------------------------------------------------------------------------//
private fun createTypeSubstitutor(irCall: IrCall): TypeSubstitutor? {
val typeArgumentsMap = (irCall as IrMemberAccessExpressionBase).typeArguments
if (typeArgumentsMap == null) return null
val substitutionContext = typeArgumentsMap.entries.associate {
(typeParameter, typeArgument) ->
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)
}
+5
View File
@@ -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"
}
@@ -0,0 +1,21 @@
package codegen.inline.typeSubstitutionInFakeOverride
import kotlin.test.*
abstract class A {
inline fun <reified T : Any> baz(): String {
return T::class.simpleName!!
}
}
class B : A() {
fun bar(): String {
return baz<OK>()
}
}
class OK
@Test fun runTest() {
println(B().bar())
}