Fix inline class secondary constructor call generation
Don't generate NEW+DUP for inline class constructor calls.
This commit is contained in:
@@ -4251,13 +4251,15 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
@NotNull
|
||||
public StackValue generateConstructorCall(@NotNull ResolvedCall<?> resolvedCall, @NotNull Type objectType) {
|
||||
return StackValue.functionCall(objectType, null, v -> {
|
||||
v.anew(objectType);
|
||||
v.dup();
|
||||
|
||||
ClassConstructorDescriptor constructor = getConstructorDescriptor(resolvedCall);
|
||||
|
||||
ReceiverParameterDescriptor dispatchReceiver = constructor.getDispatchReceiverParameter();
|
||||
ClassDescriptor containingDeclaration = constructor.getContainingDeclaration();
|
||||
|
||||
if (!containingDeclaration.isInline()) {
|
||||
v.anew(objectType);
|
||||
v.dup();
|
||||
}
|
||||
|
||||
if (dispatchReceiver != null) {
|
||||
KotlinType kotlinType = dispatchReceiver.getType();
|
||||
Type receiverType = typeMapper.mapType(kotlinType);
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
var global = "wrong"
|
||||
|
||||
inline class Foo(val x: Int) {
|
||||
constructor(y: String) : this(y.length)
|
||||
|
||||
constructor(z: Long) : this(z.toInt() + 1)
|
||||
|
||||
constructor(other: Char) : this(other.toInt().toString()) {
|
||||
global = "OK"
|
||||
}
|
||||
|
||||
constructor(a: Int, b: Int) : this(a + b)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var f = Foo("42")
|
||||
if (f.x != 2) return "Fail 1: ${f.x}"
|
||||
|
||||
f = Foo(43L)
|
||||
if (f.x != 44) return "Fail 2: ${f.x}"
|
||||
|
||||
f = Foo('a')
|
||||
if (f.x != 2) return "Fail 3: ${f.x}"
|
||||
|
||||
f = Foo(1, 2)
|
||||
if (f.x != 3) return "Fail 4: ${f.x}"
|
||||
|
||||
return global
|
||||
}
|
||||
+5
@@ -11766,6 +11766,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt")
|
||||
public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringCallingPrivateFun.kt")
|
||||
public void testToStringCallingPrivateFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt");
|
||||
|
||||
+5
@@ -11766,6 +11766,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt")
|
||||
public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringCallingPrivateFun.kt")
|
||||
public void testToStringCallingPrivateFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt");
|
||||
|
||||
+5
@@ -11766,6 +11766,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt")
|
||||
public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringCallingPrivateFun.kt")
|
||||
public void testToStringCallingPrivateFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt");
|
||||
|
||||
+5
@@ -10301,6 +10301,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt")
|
||||
public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringCallingPrivateFun.kt")
|
||||
public void testToStringCallingPrivateFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt");
|
||||
|
||||
+5
@@ -11366,6 +11366,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt")
|
||||
public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringCallingPrivateFun.kt")
|
||||
public void testToStringCallingPrivateFun() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt");
|
||||
|
||||
Reference in New Issue
Block a user