From c369949d901208c5d51e432c482eea96d7d2bc91 Mon Sep 17 00:00:00 2001 From: dnpetrov Date: Mon, 15 Jun 2015 15:40:26 +0300 Subject: [PATCH] KT-6136 VerifyError on data class inheriting from trait - coerce property values to proper data class component types - add tests #KT-6136 Fixed --- .../codegen/ImplementationBodyCodegen.java | 15 +++++++---- .../testData/codegen/box/classes/kt6136.kt | 26 +++++++++++++++++++ .../testData/codegen/box/classes/kt6136_2.kt | 20 ++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 12 +++++++++ 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/classes/kt6136.kt create mode 100644 compiler/testData/codegen/box/classes/kt6136_2.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 662053ea4ca..67d28ed0ede 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -504,8 +504,11 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { for (PropertyDescriptor propertyDescriptor : properties) { Type asmType = typeMapper.mapType(propertyDescriptor); - genPropertyOnStack(iv, context, propertyDescriptor, 0); - genPropertyOnStack(iv, context, propertyDescriptor, 2); + Type thisPropertyType = genPropertyOnStack(iv, context, propertyDescriptor, 0); + StackValue.coerce(thisPropertyType, asmType, iv); + + Type otherPropertyType = genPropertyOnStack(iv, context, propertyDescriptor, 2); + StackValue.coerce(otherPropertyType, asmType, iv); if (asmType.getSort() == Type.ARRAY) { Type elementType = correctElementType(asmType); @@ -565,10 +568,11 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { iv.mul(Type.INT_TYPE); } - genPropertyOnStack(iv, context, propertyDescriptor, 0); + Type propertyType = genPropertyOnStack(iv, context, propertyDescriptor, 0); + Type asmType = typeMapper.mapType(propertyDescriptor); + StackValue.coerce(propertyType, asmType, iv); Label ifNull = null; - Type asmType = typeMapper.mapType(propertyDescriptor); if (!isPrimitive(asmType)) { ifNull = new Label(); iv.dup(); @@ -688,7 +692,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, descriptorToDeclaration(parameter)); assert property != null : "Property descriptor is not found for primary constructor parameter: " + parameter; - genPropertyOnStack(iv, context, property, 0); + Type propertyType = genPropertyOnStack(iv, context, property, 0); + StackValue.coerce(propertyType, componentType, iv); } iv.areturn(componentType); } diff --git a/compiler/testData/codegen/box/classes/kt6136.kt b/compiler/testData/codegen/box/classes/kt6136.kt new file mode 100644 index 00000000000..58953e8cfc7 --- /dev/null +++ b/compiler/testData/codegen/box/classes/kt6136.kt @@ -0,0 +1,26 @@ +trait Id { + val id: T +} + +open data class Actor ( + override val id: Int, + val firstName: String, + val lastName: String +) : Id + +fun box(): String { + val a1 = Actor(1, "Jeff", "Bridges") + + val a1c = a1.copy() + if (a1c.id != a1.id) return "Failed: a1.copy().id==${a1c.id}" + + val a2 = Actor(2, "Jeff", "Bridges") + if (a2 == a1) return "Failed: a2==a1" + + // Assume that our hashCode is good enough for this test :) + if (a2.hashCode() == a1.hashCode()) return "Failed: a2.hashCode()==a1.hashCode()" + + a1.toString() + + return "OK" +} diff --git a/compiler/testData/codegen/box/classes/kt6136_2.kt b/compiler/testData/codegen/box/classes/kt6136_2.kt new file mode 100644 index 00000000000..7b566a076ee --- /dev/null +++ b/compiler/testData/codegen/box/classes/kt6136_2.kt @@ -0,0 +1,20 @@ +interface Id { + val id: T +} + +open data class Actor ( + id: Int, + val firstName: String, + val lastName: String +) : Id { + override val id: Int = id +} + +fun box(): String { + val a1 = Actor(1, "Jeff", "Bridges") + val a1copy = a1.copy(id = a1.id) + + if (a1copy.id != a1.id) return "Failed: a1copy.id==${a1copy.id}" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index ecb99aabb96..55623172907 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -1402,6 +1402,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt6136.kt") + public void testKt6136() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/kt6136.kt"); + doTest(fileName); + } + + @TestMetadata("kt6136_2.kt") + public void testKt6136_2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/kt6136_2.kt"); + doTest(fileName); + } + @TestMetadata("kt6816.kt") public void testKt6816() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/kt6816.kt");