diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index cceac5caf30..d6a78f2a25b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -2005,6 +2005,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("andAndWithTmpVarRhs.kt") + public void testAndAndWithTmpVarRhs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/evaluationOrder/andAndWithTmpVarRhs.kt"); + doTest(fileName); + } + @TestMetadata("assignToArrayElementWithSideEffect.kt") public void testAssignToArrayElementWithSideEffect() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/evaluationOrder/assignToArrayElementWithSideEffect.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java index 8e888476ce7..b6c899cf4b4 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.js.backend.ast.*; +import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; @@ -202,10 +203,12 @@ public final class BinaryOperationTranslator extends AbstractTranslator { if (rightExpression instanceof JsNameRef) { result = rightExpression; // Reuse tmp variable } else { - result = context().defineTemporary(rightExpression); + result = context().declareTemporary(null).reference(); + rightBlock.getStatements().add(JsAstUtils.asSyntheticStatement(JsAstUtils.assignment(result, rightExpression))); } - JsStatement assignmentStatement = JsAstUtils.assignment(result, literalResult).makeStmt(); + JsStatement assignmentStatement = JsAstUtils.asSyntheticStatement(JsAstUtils.assignment(result, literalResult)); ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock, assignmentStatement); + MetadataProperties.setSynthetic(ifStatement, true); } else { ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock); diff --git a/js/js.translator/testData/box/expression/evaluationOrder/andAndWithTmpVarRhs.kt b/js/js.translator/testData/box/expression/evaluationOrder/andAndWithTmpVarRhs.kt new file mode 100644 index 00000000000..dd606d2b493 --- /dev/null +++ b/js/js.translator/testData/box/expression/evaluationOrder/andAndWithTmpVarRhs.kt @@ -0,0 +1,8 @@ +fun foo(arg: Any): Boolean { + return arg == "x" +} + +fun box(): String { + val values = listOf(null, "x") + return if (values[0] == null && foo(values[1]!!)) "OK" else "fail" +}