From a06fc20680dcd4a4702e781cc6e88c79b2d9ba30 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 2 Sep 2021 23:39:44 +0200 Subject: [PATCH] JVM IR: erase parameter default value when copying it to bridge #KT-48391 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/backend/jvm/lower/BridgeLowering.kt | 8 ++++++-- .../kotlin/ir/util/DeclarationStubGenerator.kt | 9 +-------- .../src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 10 ++++++---- .../codegen/box/defaultArguments/kt48391.kt | 17 +++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++++ 12 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/codegen/box/defaultArguments/kt48391.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 31e61380f6b..75473e44ef5 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -12840,6 +12840,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @Test + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @Test @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index ef0400dccdc..b12827e9f26 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -563,11 +563,15 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass substitutedType: IrType? = null ): IrValueParameter = copyTo( target, IrDeclarationOrigin.BRIDGE, + startOffset = target.startOffset, + endOffset = target.endOffset, type = (substitutedType?.eraseToScope(visibleTypeParameters) ?: type.eraseTypeParameters()), // Currently there are no special bridge methods with vararg parameters, so we don't track substituted vararg element types. varargElementType = varargElementType?.eraseToScope(visibleTypeParameters), - startOffset = target.startOffset, - endOffset = target.endOffset, + // If the parameter has a default value, replace it with a stub, as if this function is coming from an external dependency. + // Otherwise it can lead to all sorts of problems, for example this default value can reference private functions from another + // file, which would rightfully make SyntheticAccessorLowering fail. + defaultValue = if (defaultValue != null) createStubDefaultValue() else null, ) private fun IrBuilderWithScope.delegatingCall( diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index e98f311470b..da91412813b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.lazy.* import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl import org.jetbrains.kotlin.ir.linkage.IrProvider import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol @@ -241,13 +240,7 @@ abstract class DeclarationStubGenerator( varargElementType?.toIrType(), isCrossinline, isNoinline, isHidden = false, isAssignable = false ).also { irValueParameter -> if (descriptor.declaresDefaultValue()) { - irValueParameter.defaultValue = - irValueParameter.factory.createExpressionBody( - IrErrorExpressionImpl( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, descriptor.type.toIrType(), - "Stub expression for default value of ${descriptor.name}" - ) - ) + irValueParameter.defaultValue = irValueParameter.createStubDefaultValue() } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index f54eac4da96..6c8dde1c636 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.ir.IrBuiltIns -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* @@ -174,6 +171,11 @@ fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns, fun IrFunctionAccessExpression.usesDefaultArguments(): Boolean = symbol.owner.valueParameters.any { this.getValueArgument(it.index) == null } +fun IrValueParameter.createStubDefaultValue(): IrExpressionBody = + factory.createExpressionBody( + IrErrorExpressionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, "Stub expression for default value of $name") + ) + val IrClass.functions: Sequence get() = declarations.asSequence().filterIsInstance() diff --git a/compiler/testData/codegen/box/defaultArguments/kt48391.kt b/compiler/testData/codegen/box/defaultArguments/kt48391.kt new file mode 100644 index 00000000000..a29a49e9e77 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/kt48391.kt @@ -0,0 +1,17 @@ +// FILE: 1.kt + +class B : A + +fun box(): String = + B().f()!! + +// FILE: 2.kt + +interface A { + fun f(s: String = RESULT): T? = + s as T + + companion object { + private val RESULT = "OK" + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 87be82f0e90..3b5f93fcae4 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -12768,6 +12768,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @Test + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @Test @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 2c652a8ab88..f3855957dd8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -12840,6 +12840,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @Test + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @Test @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index d0d481ef365..122c2e72169 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10335,6 +10335,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 811ba0aa1d1..154af17d2ce 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -9189,6 +9189,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 89c295584bb..982eda10c93 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -8595,6 +8595,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 380c9bd96c1..3968ab13bf7 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8575,6 +8575,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index f3369bd8ed5..37e5a52f9d1 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -4100,6 +4100,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/defaultArguments/kt47073_nested.kt"); } + @TestMetadata("kt48391.kt") + public void testKt48391() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/kt48391.kt"); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/kt6382.kt");