JVM IR: Don't generate bridges for default argument stubs (KT-46389)
This commit is contained in:
committed by
Alexander Udalov
parent
40b5a7d449
commit
1eb9a5a86d
+12
@@ -2130,6 +2130,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
|
|||||||
+10
-2
@@ -200,8 +200,16 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
// Track final overrides and bridges to avoid clashes
|
// Track final overrides and bridges to avoid clashes
|
||||||
val blacklist = mutableSetOf<Method>()
|
val blacklist = mutableSetOf<Method>()
|
||||||
|
|
||||||
// Add the current method to the blacklist if it is concrete or final.
|
// Don't generate bridges for default argument stubs. This is a workaround for a
|
||||||
val targetMethod = (irFunction.resolveFakeOverride() ?: irFunction).jvmMethod
|
// frontend bug (KT-36188). Ideally, the frontend should not allow inheriting from
|
||||||
|
// multiple different default argument stubs, but for now we need this special case
|
||||||
|
// to avoid a ClassCastException in the inliner (KT-46389).
|
||||||
|
val targetFunction = irFunction.resolveFakeOverride() ?: irFunction
|
||||||
|
if (targetFunction.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Add the current method to the blacklist if it is concrete or final
|
||||||
|
val targetMethod = targetFunction.jvmMethod
|
||||||
if (!irFunction.isFakeOverride || irFunction.modality == Modality.FINAL)
|
if (!irFunction.isFakeOverride || irFunction.modality == Modality.FINAL)
|
||||||
blacklist += targetMethod
|
blacklist += targetMethod
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
// IGNORE_BACKEND: JS, JS_IR
|
||||||
|
|
||||||
|
// The code in this test should be prohibited in the frontend, see KT-36188.
|
||||||
|
|
||||||
|
// This test fails with an IllegalStateException on the JS(-IR) backend,
|
||||||
|
// but the behavior would probably not match the JVM backend even if
|
||||||
|
// the test passed. Compare with kt46389_jvmDefault.
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
fun h(x: String = "O"): Any
|
||||||
|
}
|
||||||
|
|
||||||
|
interface I2 : I
|
||||||
|
|
||||||
|
open class A {
|
||||||
|
inline fun h(x: String = "K") = x
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : A(), I2
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return "${(B() as I).h()}${B().h()}"
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// IGNORE_BACKEND: JS, JS_IR
|
||||||
|
// !JVM_DEFAULT_MODE: all
|
||||||
|
// JVM_TARGET: 1.8
|
||||||
|
|
||||||
|
// The code in this test should be prohibited in the frontend, see KT-36188.
|
||||||
|
|
||||||
|
// Before the fix to kt46389, the IR backend would have added a bridge
|
||||||
|
// for `h$default` in `B`, which would have lead both calls to use "K"
|
||||||
|
// as the default value. This would arguably be less surprising, but is
|
||||||
|
// impossible to match without jvm-default on the JVM(-IR)backend.
|
||||||
|
//
|
||||||
|
// Meanwhile, the two calls using "K" as the default value is the current
|
||||||
|
// behavior on the JS backend, which is why the test is muted for the JS
|
||||||
|
// backend.
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
fun h(x: String = "O"): Any
|
||||||
|
}
|
||||||
|
|
||||||
|
interface I2 : I
|
||||||
|
|
||||||
|
open class A {
|
||||||
|
fun h(x: String = "K") = x
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : A(), I2
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return "${(B() as I).h()}${B().h()}"
|
||||||
|
}
|
||||||
+12
@@ -2058,6 +2058,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
|
|||||||
+12
@@ -2130,6 +2130,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
|
|||||||
+10
@@ -1808,6 +1808,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
||||||
|
|||||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
Generated
+10
@@ -1273,6 +1273,16 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
||||||
|
|||||||
Generated
+10
@@ -1273,6 +1273,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
||||||
|
|||||||
Generated
+10
@@ -1253,6 +1253,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
||||||
|
|||||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java
Generated
+10
@@ -1138,6 +1138,16 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
runTest("compiler/testData/codegen/box/bridges/kt42137.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389.kt")
|
||||||
|
public void testKt46389() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt46389_jvmDefault.kt")
|
||||||
|
public void testKt46389_jvmDefault() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("longChainOneBridge.kt")
|
@TestMetadata("longChainOneBridge.kt")
|
||||||
public void testLongChainOneBridge() throws Exception {
|
public void testLongChainOneBridge() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
runTest("compiler/testData/codegen/box/bridges/longChainOneBridge.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user