Return Unit.VALUE if Unit or Any is expected
StackValue.coerce will do its job in casting void to Unit correctly #KT-4212 Fixed
This commit is contained in:
@@ -1607,13 +1607,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
public void returnExpression(JetExpression expr) {
|
public void returnExpression(JetExpression expr) {
|
||||||
StackValue lastValue = gen(expr);
|
StackValue lastValue = gen(expr);
|
||||||
|
|
||||||
if (lastValue.type != Type.VOID_TYPE) {
|
if (!endsWithReturn(expr)) {
|
||||||
lastValue.put(returnType, v);
|
lastValue.put(returnType, v);
|
||||||
v.areturn(returnType);
|
v.areturn(returnType);
|
||||||
}
|
}
|
||||||
else if (!endsWithReturn(expr)) {
|
|
||||||
v.areturn(returnType);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean endsWithReturn(JetElement bodyExpression) {
|
private static boolean endsWithReturn(JetElement bodyExpression) {
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
fun foo(): Any? = bar()
|
||||||
|
|
||||||
|
fun bar() {}
|
||||||
|
|
||||||
|
fun baz(): Any? {
|
||||||
|
return bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun quux(): Unit? = bar()
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
foo()
|
||||||
|
|
||||||
|
if (foo() != Unit.VALUE) return "Fail 1"
|
||||||
|
if (foo() != bar()) return "Fail 2"
|
||||||
|
if (bar() != baz()) return "Fail 3"
|
||||||
|
if (baz() != quux()) return "Fail 4"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -4764,6 +4764,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/unit"), Pattern.compile("^(.+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/unit"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt4212.kt")
|
||||||
|
public void testKt4212() throws Exception {
|
||||||
|
doTest("compiler/testData/codegen/box/unit/kt4212.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt4265.kt")
|
@TestMetadata("kt4265.kt")
|
||||||
public void testKt4265() throws Exception {
|
public void testKt4265() throws Exception {
|
||||||
doTest("compiler/testData/codegen/box/unit/kt4265.kt");
|
doTest("compiler/testData/codegen/box/unit/kt4265.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user