Fix secondary constructors of generic inline classes

#KT-42649 Fixed.
This commit is contained in:
SvyatoslavScherbina
2020-10-15 10:22:18 +03:00
committed by GitHub
parent b7470495f2
commit 9b53cded94
3 changed files with 30 additions and 1 deletions
@@ -519,6 +519,13 @@ private val Context.getLoweredInlineClassConstructor: (IrConstructor) -> IrSimpl
).apply {
descriptor.bind(this)
parent = irConstructor.parent
valueParameters += irConstructor.valueParameters.map { it.copyTo(this) }
// Note: technically speaking, this function doesn't have access to class type parameters (since it is "static").
// But, technically speaking, otherwise we would have to remap types in the entire IR subtree,
// which is an overkill here, because type parameters don't matter at this phase of compilation and later.
// So it is just a trick to make [copyTo] happy:
val remapTypeMap = irConstructor.constructedClass.typeParameters.associateBy { it }
valueParameters += irConstructor.valueParameters.map { it.copyTo(this, remapTypeMap = remapTypeMap) }
}
}
+4
View File
@@ -3172,6 +3172,10 @@ task inlineClass_defaultEquals(type: KonanLocalTest) {
source = "codegen/inlineClass/defaultEquals.kt"
}
task inlineClass_secondaryConstructorWithGenerics(type: KonanLocalTest) {
source = "codegen/inlineClass/secondaryConstructorWithGenerics.kt"
}
task deserialized_inline0(type: KonanLocalTest) {
source = "serialization/deserialized_inline0.kt"
}
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package codegen.inlineClass.secondaryConstructorWithGenerics
import kotlin.test.*
// Based on KT-42649.
inline class IC<T>(val value: List<T>) {
constructor(value: T) : this(listOf(value))
}
@Test
fun runTest() {
assertEquals("abc", IC("abc").value.singleOrNull())
}