Fixed bug in post-inline lowering
This commit is contained in:
committed by
Sergey Bogolepov
parent
2a78a8dade
commit
d04ee83e76
+10
-6
@@ -17,10 +17,9 @@
|
||||
package org.jetbrains.kotlin.backend.konan.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.lower.IrBuildingTransformer
|
||||
import org.jetbrains.kotlin.backend.common.lower.at
|
||||
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.typeWith
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.typeWithStarProjections
|
||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.typeWithoutArguments
|
||||
import org.jetbrains.kotlin.backend.konan.reportCompilationError
|
||||
@@ -40,11 +39,13 @@ internal class PostInlineLowering(val context: Context) : FileLoweringPass {
|
||||
private val symbols get() = context.ir.symbols
|
||||
|
||||
override fun lower(irFile: IrFile) {
|
||||
irFile.transformChildrenVoid(object : IrBuildingTransformer(context) {
|
||||
irFile.transformChildrenVoid(object : IrElementTransformerVoidWithContext() {
|
||||
|
||||
override fun visitClassReference(expression: IrClassReference): IrExpression {
|
||||
expression.transformChildrenVoid()
|
||||
builder.at(expression)
|
||||
|
||||
val builder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol,
|
||||
expression.startOffset, expression.endOffset)
|
||||
|
||||
val typeArgument = expression.symbol.typeWithStarProjections
|
||||
|
||||
@@ -55,9 +56,12 @@ internal class PostInlineLowering(val context: Context) : FileLoweringPass {
|
||||
|
||||
override fun visitGetClass(expression: IrGetClass): IrExpression {
|
||||
expression.transformChildrenVoid()
|
||||
builder.at(expression)
|
||||
|
||||
val builder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol,
|
||||
expression.startOffset, expression.endOffset)
|
||||
|
||||
val typeArgument = expression.argument.type
|
||||
|
||||
return builder.irCall(symbols.kClassImplConstructor, listOf(typeArgument)).apply {
|
||||
val typeInfo = builder.irCall(symbols.getObjectTypeInfo).apply {
|
||||
putValueArgument(0, expression.argument)
|
||||
|
||||
@@ -1231,6 +1231,11 @@ task kclass1(type: RunKonanTest) {
|
||||
source = "codegen/kclass/kclass1.kt"
|
||||
}
|
||||
|
||||
task kclassEnumArgument(type: RunKonanTest) {
|
||||
goldValue = "String\n"
|
||||
source = "codegen/kclass/kClassEnumArgument.kt"
|
||||
}
|
||||
|
||||
task coroutines_simple(type: RunKonanTest) {
|
||||
goldValue = "42\n"
|
||||
source = "codegen/coroutines/simple.kt"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package codegen.kclass.kClassEnumArgument
|
||||
|
||||
import kotlin.test.*
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
enum class E(val arg: KClass<*>?) {
|
||||
A(null as KClass<*>?),
|
||||
B(String::class);
|
||||
}
|
||||
|
||||
@Test fun runTest() {
|
||||
println(E.B.arg?.simpleName)
|
||||
}
|
||||
Reference in New Issue
Block a user