Fix inline class secondary constructor call generation

Don't generate NEW+DUP for inline class constructor calls.
This commit is contained in:
Dmitry Petrov
2018-08-30 12:38:31 +03:00
parent 80a67477db
commit 05daa21657
7 changed files with 63 additions and 4 deletions
@@ -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);
@@ -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
}
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");