From ab753625fefbddac984367ffb2b52315406b085f Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Mon, 11 Jan 2021 21:49:06 +0300 Subject: [PATCH] [JS Legacy] Fix returning Char from suspend functions (KT-44221) Mark translated expression with a proper type, like we do with non-suspending calls, to coerce it later. --- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 ++++ .../codegen/box/coroutines/kt44221.kt | 24 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ .../callTranslator/CallTranslator.kt | 2 +- 9 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/coroutines/kt44221.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 38d146b334b..0a15602d41b 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -6853,6 +6853,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/compiler/testData/codegen/box/coroutines/kt44221.kt b/compiler/testData/codegen/box/coroutines/kt44221.kt new file mode 100644 index 00000000000..631344981e5 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/kt44221.kt @@ -0,0 +1,24 @@ +// WITH_RUNTIME + +import kotlin.coroutines.* + +fun launch(block: suspend () -> String): String { + var result = "" + block.startCoroutine(Continuation(EmptyCoroutineContext) { result = it.getOrThrow() }) + return result +} + + +private class CharTest { + private val test: Char = '!' + + fun simpleTest() = launch { + val ch = get() + if (ch == '!') "OK" else "Fail" + } + + suspend fun get(): Char? = test +} + + +fun box(): String = CharTest().simpleTest() \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 182df123be2..4a77950d146 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -6853,6 +6853,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c04fc51edf2..fb923e6527a 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -6853,6 +6853,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index f2f5dabdc9b..52df58a5186 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -6853,6 +6853,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index f0c9b263cd1..d73f082b1d0 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -5658,6 +5658,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index cc9d02119a6..4ff74f60449 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -5658,6 +5658,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index f956b3453ad..b71e5cf4809 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -5658,6 +5658,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/coroutines/kt42554.kt"); } + @TestMetadata("kt44221.kt") + public void testKt44221() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/kt44221.kt"); + } + @TestMetadata("lastExpressionIsLoop.kt") public void testLastExpressionIsLoop() throws Exception { runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt index 6054d7af253..1177ee34099 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt @@ -157,7 +157,7 @@ private fun translateFunctionCall( source = resolvedCall.call.callElement })) context.currentBlock.statements += statement - return context.createCoroutineResult(resolvedCall) + callExpression = context.createCoroutineResult(resolvedCall) } else { callExpression = callInfo.constructSafeCallIfNeeded(callExpression)