Fixed bug in post-inline lowering

This commit is contained in:
Sergey Bogolepov
2018-07-18 12:01:46 +07:00
committed by Sergey Bogolepov
parent 2a78a8dade
commit d04ee83e76
3 changed files with 28 additions and 6 deletions
@@ -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)
+5
View File
@@ -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)
}