JVM_IR KT-32701 generate multiple big arity invokes, report error later
This commit is contained in:
+15
-19
@@ -76,26 +76,22 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) :
|
|||||||
return super.visitClassNew(declaration)
|
return super.visitClassNew(declaration)
|
||||||
declaration.transformChildrenVoid(this)
|
declaration.transformChildrenVoid(this)
|
||||||
|
|
||||||
// Note that we allow classes with multiple function supertypes, so long as only one
|
// Note that we allow classes with multiple function supertypes, so long as only one of them has more than 22 arguments.
|
||||||
// of them has more than 22 arguments.
|
// Code below will generate one 'invoke' for each function supertype,
|
||||||
// TODO: Add a proper diagnostic message in the frontend
|
// which will cause conflicting inherited JVM signatures error diagnostics in case of multiple big arity function supertypes.
|
||||||
assert(bigArityFunctionSuperTypes.size == 1) {
|
for (superType in bigArityFunctionSuperTypes) {
|
||||||
"Class has multiple big-arity function super types: ${bigArityFunctionSuperTypes.joinToString { it.render() }}"
|
declaration.superTypes -= superType
|
||||||
}
|
declaration.superTypes += context.ir.symbols.functionN.typeWith(
|
||||||
|
(superType.arguments.last() as IrTypeProjection).type
|
||||||
|
)
|
||||||
|
|
||||||
// Fix super class
|
// Add vararg invoke bridge
|
||||||
val superType = bigArityFunctionSuperTypes.single()
|
val invokeFunction = declaration.functions.single {
|
||||||
declaration.superTypes -= superType
|
it.name.asString() == "invoke" && it.valueParameters.size == superType.arguments.size - if (it.isSuspend) 0 else 1
|
||||||
declaration.superTypes += context.ir.symbols.functionN.typeWith(
|
}
|
||||||
(superType.arguments.last() as IrTypeProjection).type
|
invokeFunction.overriddenSymbols = emptyList()
|
||||||
)
|
declaration.addBridge(invokeFunction, functionNInvokeFun.owner)
|
||||||
|
|
||||||
// Add vararg invoke bridge
|
|
||||||
val invokeFunction = declaration.functions.single {
|
|
||||||
it.name.asString() == "invoke" && it.valueParameters.size == superType.arguments.size - if (it.isSuspend) 0 else 1
|
|
||||||
}
|
}
|
||||||
invokeFunction.overriddenSymbols = emptyList()
|
|
||||||
declaration.addBridge(invokeFunction, functionNInvokeFun.owner)
|
|
||||||
|
|
||||||
return declaration
|
return declaration
|
||||||
}
|
}
|
||||||
@@ -123,7 +119,7 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) :
|
|||||||
irInt(argumentCount)
|
irInt(argumentCount)
|
||||||
),
|
),
|
||||||
irCall(context.irBuiltIns.illegalArgumentExceptionSymbol).apply {
|
irCall(context.irBuiltIns.illegalArgumentExceptionSymbol).apply {
|
||||||
putValueArgument(0, irString("Expected ${argumentCount} arguments"))
|
putValueArgument(0, irString("Expected $argumentCount arguments"))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// TARGET_BACKEND: JVM_OLD
|
||||||
|
class <!CONFLICTING_JVM_DECLARATIONS!>Fun<!> :
|
||||||
|
(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int,
|
||||||
|
Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Int,
|
||||||
|
(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int,
|
||||||
|
Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Int
|
||||||
|
{
|
||||||
|
override fun invoke(
|
||||||
|
p00: Int, p01: Int, p02: Int, p03: Int, p04: Int, p05: Int, p06: Int, p07: Int, p08: Int, p09: Int,
|
||||||
|
p10: Int, p11: Int, p12: Int, p13: Int, p14: Int, p15: Int, p16: Int, p17: Int, p18: Int, p19: Int,
|
||||||
|
p20: Int, p21: Int, p22: Int, p23: Int, p24: Int, p25: Int, p26: Int, p27: Int, p28: Int, p29: Int
|
||||||
|
): Int = 330
|
||||||
|
|
||||||
|
override fun invoke(
|
||||||
|
p00: Int, p01: Int, p02: Int, p03: Int, p04: Int, p05: Int, p06: Int, p07: Int, p08: Int, p09: Int,
|
||||||
|
p10: Int, p11: Int, p12: Int, p13: Int, p14: Int, p15: Int, p16: Int, p17: Int, p18: Int, p19: Int,
|
||||||
|
p20: Int, p21: Int, p22: Int, p23: Int, p24: Int, p25: Int, p26: Int, p27: Int, p28: Int, p29: Int,
|
||||||
|
p30: Int, p31: Int, p32: Int
|
||||||
|
): Int = 333
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public final class Fun : (kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int) -> kotlin.Int, (kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int) -> kotlin.Int {
|
||||||
|
public constructor Fun()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ fun invoke(/*0*/ p00: kotlin.Int, /*1*/ p01: kotlin.Int, /*2*/ p02: kotlin.Int, /*3*/ p03: kotlin.Int, /*4*/ p04: kotlin.Int, /*5*/ p05: kotlin.Int, /*6*/ p06: kotlin.Int, /*7*/ p07: kotlin.Int, /*8*/ p08: kotlin.Int, /*9*/ p09: kotlin.Int, /*10*/ p10: kotlin.Int, /*11*/ p11: kotlin.Int, /*12*/ p12: kotlin.Int, /*13*/ p13: kotlin.Int, /*14*/ p14: kotlin.Int, /*15*/ p15: kotlin.Int, /*16*/ p16: kotlin.Int, /*17*/ p17: kotlin.Int, /*18*/ p18: kotlin.Int, /*19*/ p19: kotlin.Int, /*20*/ p20: kotlin.Int, /*21*/ p21: kotlin.Int, /*22*/ p22: kotlin.Int, /*23*/ p23: kotlin.Int, /*24*/ p24: kotlin.Int, /*25*/ p25: kotlin.Int, /*26*/ p26: kotlin.Int, /*27*/ p27: kotlin.Int, /*28*/ p28: kotlin.Int, /*29*/ p29: kotlin.Int): kotlin.Int
|
||||||
|
public open override /*1*/ fun invoke(/*0*/ p00: kotlin.Int, /*1*/ p01: kotlin.Int, /*2*/ p02: kotlin.Int, /*3*/ p03: kotlin.Int, /*4*/ p04: kotlin.Int, /*5*/ p05: kotlin.Int, /*6*/ p06: kotlin.Int, /*7*/ p07: kotlin.Int, /*8*/ p08: kotlin.Int, /*9*/ p09: kotlin.Int, /*10*/ p10: kotlin.Int, /*11*/ p11: kotlin.Int, /*12*/ p12: kotlin.Int, /*13*/ p13: kotlin.Int, /*14*/ p14: kotlin.Int, /*15*/ p15: kotlin.Int, /*16*/ p16: kotlin.Int, /*17*/ p17: kotlin.Int, /*18*/ p18: kotlin.Int, /*19*/ p19: kotlin.Int, /*20*/ p20: kotlin.Int, /*21*/ p21: kotlin.Int, /*22*/ p22: kotlin.Int, /*23*/ p23: kotlin.Int, /*24*/ p24: kotlin.Int, /*25*/ p25: kotlin.Int, /*26*/ p26: kotlin.Int, /*27*/ p27: kotlin.Int, /*28*/ p28: kotlin.Int, /*29*/ p29: kotlin.Int, /*30*/ p30: kotlin.Int, /*31*/ p31: kotlin.Int, /*32*/ p32: kotlin.Int): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
class <!CONFLICTING_INHERITED_JVM_DECLARATIONS!>Fun<!> :
|
||||||
|
(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int,
|
||||||
|
Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Int,
|
||||||
|
(Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int,
|
||||||
|
Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Int
|
||||||
|
{
|
||||||
|
override fun invoke(
|
||||||
|
p00: Int, p01: Int, p02: Int, p03: Int, p04: Int, p05: Int, p06: Int, p07: Int, p08: Int, p09: Int,
|
||||||
|
p10: Int, p11: Int, p12: Int, p13: Int, p14: Int, p15: Int, p16: Int, p17: Int, p18: Int, p19: Int,
|
||||||
|
p20: Int, p21: Int, p22: Int, p23: Int, p24: Int, p25: Int, p26: Int, p27: Int, p28: Int, p29: Int
|
||||||
|
): Int = 330
|
||||||
|
|
||||||
|
override fun invoke(
|
||||||
|
p00: Int, p01: Int, p02: Int, p03: Int, p04: Int, p05: Int, p06: Int, p07: Int, p08: Int, p09: Int,
|
||||||
|
p10: Int, p11: Int, p12: Int, p13: Int, p14: Int, p15: Int, p16: Int, p17: Int, p18: Int, p19: Int,
|
||||||
|
p20: Int, p21: Int, p22: Int, p23: Int, p24: Int, p25: Int, p26: Int, p27: Int, p28: Int, p29: Int,
|
||||||
|
p30: Int, p31: Int, p32: Int
|
||||||
|
): Int = 333
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public final class Fun : (kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int) -> kotlin.Int, (kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int, kotlin.Int) -> kotlin.Int {
|
||||||
|
public constructor Fun()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ fun invoke(/*0*/ p00: kotlin.Int, /*1*/ p01: kotlin.Int, /*2*/ p02: kotlin.Int, /*3*/ p03: kotlin.Int, /*4*/ p04: kotlin.Int, /*5*/ p05: kotlin.Int, /*6*/ p06: kotlin.Int, /*7*/ p07: kotlin.Int, /*8*/ p08: kotlin.Int, /*9*/ p09: kotlin.Int, /*10*/ p10: kotlin.Int, /*11*/ p11: kotlin.Int, /*12*/ p12: kotlin.Int, /*13*/ p13: kotlin.Int, /*14*/ p14: kotlin.Int, /*15*/ p15: kotlin.Int, /*16*/ p16: kotlin.Int, /*17*/ p17: kotlin.Int, /*18*/ p18: kotlin.Int, /*19*/ p19: kotlin.Int, /*20*/ p20: kotlin.Int, /*21*/ p21: kotlin.Int, /*22*/ p22: kotlin.Int, /*23*/ p23: kotlin.Int, /*24*/ p24: kotlin.Int, /*25*/ p25: kotlin.Int, /*26*/ p26: kotlin.Int, /*27*/ p27: kotlin.Int, /*28*/ p28: kotlin.Int, /*29*/ p29: kotlin.Int): kotlin.Int
|
||||||
|
public open override /*1*/ fun invoke(/*0*/ p00: kotlin.Int, /*1*/ p01: kotlin.Int, /*2*/ p02: kotlin.Int, /*3*/ p03: kotlin.Int, /*4*/ p04: kotlin.Int, /*5*/ p05: kotlin.Int, /*6*/ p06: kotlin.Int, /*7*/ p07: kotlin.Int, /*8*/ p08: kotlin.Int, /*9*/ p09: kotlin.Int, /*10*/ p10: kotlin.Int, /*11*/ p11: kotlin.Int, /*12*/ p12: kotlin.Int, /*13*/ p13: kotlin.Int, /*14*/ p14: kotlin.Int, /*15*/ p15: kotlin.Int, /*16*/ p16: kotlin.Int, /*17*/ p17: kotlin.Int, /*18*/ p18: kotlin.Int, /*19*/ p19: kotlin.Int, /*20*/ p20: kotlin.Int, /*21*/ p21: kotlin.Int, /*22*/ p22: kotlin.Int, /*23*/ p23: kotlin.Int, /*24*/ p24: kotlin.Int, /*25*/ p25: kotlin.Int, /*26*/ p26: kotlin.Int, /*27*/ p27: kotlin.Int, /*28*/ p28: kotlin.Int, /*29*/ p29: kotlin.Int, /*30*/ p30: kotlin.Int, /*31*/ p31: kotlin.Int, /*32*/ p32: kotlin.Int): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
Generated
+5
@@ -39,6 +39,11 @@ public class DiagnosticsTestWithJvmIrBackendGenerated extends AbstractDiagnostic
|
|||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle_ir.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle_ir.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multipleBigArityFunsImplemented_ir.kt")
|
||||||
|
public void testMultipleBigArityFunsImplemented_ir() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/multipleBigArityFunsImplemented_ir.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("suspendInlineCycle_ir.kt")
|
@TestMetadata("suspendInlineCycle_ir.kt")
|
||||||
public void testSuspendInlineCycle_ir() throws Exception {
|
public void testSuspendInlineCycle_ir() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle_ir.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle_ir.kt");
|
||||||
|
|||||||
Generated
+5
@@ -39,6 +39,11 @@ public class DiagnosticsTestWithOldJvmBackendGenerated extends AbstractDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multipleBigArityFunsImplemented.kt")
|
||||||
|
public void testMultipleBigArityFunsImplemented() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/multipleBigArityFunsImplemented.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("suspendInlineCycle.kt")
|
@TestMetadata("suspendInlineCycle.kt")
|
||||||
public void testSuspendInlineCycle() throws Exception {
|
public void testSuspendInlineCycle() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle.kt");
|
runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user