From d04ee83e7600558804abd9e2f29846be8dd3e1f8 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 18 Jul 2018 12:01:46 +0700 Subject: [PATCH] Fixed bug in post-inline lowering --- .../backend/konan/lower/PostInlineLowering.kt | 16 ++++++++++------ backend.native/tests/build.gradle | 5 +++++ .../tests/codegen/kclass/kClassEnumArgument.kt | 13 +++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 backend.native/tests/codegen/kclass/kClassEnumArgument.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt index 91b420524fd..219d958f758 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt @@ -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) diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 88cc522ff2b..336daeb1ce1 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -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" diff --git a/backend.native/tests/codegen/kclass/kClassEnumArgument.kt b/backend.native/tests/codegen/kclass/kClassEnumArgument.kt new file mode 100644 index 00000000000..763ea8bbb78 --- /dev/null +++ b/backend.native/tests/codegen/kclass/kClassEnumArgument.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) +} \ No newline at end of file