From cdd3f823966eea4c24df54f33488cb2cd5ebc5c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Thu, 22 Aug 2019 11:18:46 +0200 Subject: [PATCH] JVM IR: Use correct scope owner in JvmInlineClassLowering --- .../backend/jvm/lower/JvmInlineClassLowering.kt | 14 ++++++++------ .../defaultValueOfInlineClassTypeInInlineFun.kt | 1 - .../inlineFunctionInsideInlineClass.kt | 1 - .../noActualCallsOfInlineFunctionsOfInlineClass.kt | 1 - 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt index 04f0731bada..7585f18c8ec 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass +import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.ir.copyParameterDeclarationsFrom import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom import org.jetbrains.kotlin.backend.common.lower.createIrBuilder @@ -46,7 +47,7 @@ val jvmInlineClassPhase = makeIrFilePhase( * We do not unfold inline class types here. Instead, the type mapper will lower inline class * types to the types of their underlying field. */ -private class JvmInlineClassLowering(private val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoid() { +private class JvmInlineClassLowering(private val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoidWithContext() { private val manager = MemoizedInlineClassReplacements() private val valueMap = mutableMapOf() @@ -54,7 +55,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F irFile.transformChildrenVoid() } - override fun visitClass(declaration: IrClass): IrStatement { + override fun visitClassNew(declaration: IrClass): IrStatement { // The arguments to the primary constructor are in scope in the initializers of IrFields. declaration.primaryConstructor?.let { manager.getReplacementFunction(it)?.let { replacement -> @@ -231,9 +232,10 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F val function = expression.symbol.owner val replacement = manager.getReplacementFunction(function) ?: return super.visitFunctionAccess(expression) - return context.createIrBuilder(expression.symbol).irCall(replacement.function).apply { - buildReplacement(function, expression, replacement) - } + return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset) + .irCall(replacement.function).apply { + buildReplacement(function, expression, replacement) + } } private fun coerceInlineClasses(argument: IrExpression, from: IrType, to: IrType) = @@ -264,7 +266,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F override fun visitReturn(expression: IrReturn): IrExpression { expression.returnTargetSymbol.owner.safeAs()?.let { target -> manager.getReplacementFunction(target)?.let { - return context.createIrBuilder(it.function.symbol).irReturn( + return context.createIrBuilder(it.function.symbol, expression.startOffset, expression.endOffset).irReturn( expression.value.transform(this, null) ) } diff --git a/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/defaultValueOfInlineClassTypeInInlineFun.kt b/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/defaultValueOfInlineClassTypeInInlineFun.kt index cefca461fda..dfe597c6c94 100644 --- a/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/defaultValueOfInlineClassTypeInInlineFun.kt +++ b/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/defaultValueOfInlineClassTypeInInlineFun.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JVM_IR inline class Z(val int: Int) inline class L(val long: Long) diff --git a/compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt b/compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt index 8668648db6b..4b4ea1c59df 100644 --- a/compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt +++ b/compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JVM_IR inline class Foo(val x: Int) { inline fun inc(): Foo = Foo(x + 1) diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/noActualCallsOfInlineFunctionsOfInlineClass.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/noActualCallsOfInlineFunctionsOfInlineClass.kt index c383d4db318..b2127dba123 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/noActualCallsOfInlineFunctionsOfInlineClass.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/noActualCallsOfInlineFunctionsOfInlineClass.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JVM_IR inline class Foo(val x: Int) { inline fun inlineInc(): Foo = Foo(x + 1)