diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index fe77c459d94..9dcb9856e02 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -1168,6 +1168,11 @@ public abstract class StackValue { else { coerce(topOfStackType, ArraysKt.last(setter.getParameterTypes()), v); setter.genInvokeInstruction(v); + + Type returnType = setter.getReturnType(); + if (returnType != Type.VOID_TYPE) { + pop(v, returnType); + } } } diff --git a/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.java b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.java new file mode 100644 index 00000000000..55155e946d6 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.java @@ -0,0 +1,12 @@ +class JavaClass { + private String myX = ""; + + public String getX() { + return myX; + } + + public JavaClass setX(String x) { + myX = x; + return this; + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.kt b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.kt new file mode 100644 index 00000000000..bfc058a54b0 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.kt @@ -0,0 +1,7 @@ +fun box(): String { + val javaClass = JavaClass() + if (javaClass.x.isEmpty()) { + javaClass.x = "OK" + } + return javaClass.x +} diff --git a/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.java b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.java new file mode 100644 index 00000000000..3af73d0e17e --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.java @@ -0,0 +1,12 @@ +class JavaClass { + private String myX = ""; + + public String getX() { + return myX; + } + + public double setX(String x) { + myX = x; + return 1.0; + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.kt b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.kt new file mode 100644 index 00000000000..bfc058a54b0 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.kt @@ -0,0 +1,7 @@ +fun box(): String { + val javaClass = JavaClass() + if (javaClass.x.isEmpty()) { + javaClass.x = "OK" + } + return javaClass.x +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 45ee503185e..0487967b7c4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -904,6 +904,18 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod doTestAgainstJava(fileName); } + @TestMetadata("setterNonVoid1.kt") + public void testSetterNonVoid1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid1.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("setterNonVoid2.kt") + public void testSetterNonVoid2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/syntheticExtensions/setterNonVoid2.kt"); + doTestAgainstJava(fileName); + } + @TestMetadata("_protected.kt") public void test_protected() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/syntheticExtensions/_protected.kt");