KT-6136 VerifyError on data class inheriting from trait

- coerce property values to proper data class component types
- add tests
 #KT-6136 Fixed
This commit is contained in:
dnpetrov
2015-06-15 15:40:26 +03:00
parent a906b0336f
commit c369949d90
4 changed files with 68 additions and 5 deletions
@@ -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);
}
+26
View File
@@ -0,0 +1,26 @@
trait Id<T> {
val id: T
}
open data class Actor (
override val id: Int,
val firstName: String,
val lastName: String
) : Id<Int>
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"
}
+20
View File
@@ -0,0 +1,20 @@
interface Id<T> {
val id: T
}
open data class Actor (
id: Int,
val firstName: String,
val lastName: String
) : Id<Int> {
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"
}
@@ -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");