From a7492e91c9fe33c4e65cd50623fe7ce32aab8982 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 19 Jun 2018 14:39:40 +0300 Subject: [PATCH] Check that subject expression is evaluated only once --- .../subjectExpressionIsEvaluatedOnce.kt | 22 +++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 6 files changed, 47 insertions(+) create mode 100644 compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt diff --git a/compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt b/compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt new file mode 100644 index 00000000000..0da0c54b834 --- /dev/null +++ b/compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt @@ -0,0 +1,22 @@ +// !LANGUAGE: +VariableDeclarationInWhenSubject +// IGNORE_BACKEND: JS + +var effectCount = 0 + +fun withSideEffect(): Any { + effectCount++ + return 42 +} + +fun box(): String { + when (val y = withSideEffect()) { + 1 -> throw AssertionError() + "" -> throw AssertionError() + is String -> throw AssertionError() + 42 -> {} + } + + if (effectCount != 1) throw AssertionError("effectCount=$effectCount") + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 69ae1efb2c1..545c8ec7781 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -21708,6 +21708,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/when/whenSubjectVariable/sparseIntSwitchWithSubjectVariable.kt"); } + @TestMetadata("subjectExpressionIsEvaluatedOnce.kt") + public void testSubjectExpressionIsEvaluatedOnce() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt"); + } + @TestMetadata("whenByEnum.kt") public void testWhenByEnum() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/whenByEnum.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 0c7c96adf22..1f8a30a79f8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -21708,6 +21708,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/sparseIntSwitchWithSubjectVariable.kt"); } + @TestMetadata("subjectExpressionIsEvaluatedOnce.kt") + public void testSubjectExpressionIsEvaluatedOnce() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt"); + } + @TestMetadata("whenByEnum.kt") public void testWhenByEnum() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/whenByEnum.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f8c10bfce11..d9fd1f2ec3b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -21708,6 +21708,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/when/whenSubjectVariable/sparseIntSwitchWithSubjectVariable.kt"); } + @TestMetadata("subjectExpressionIsEvaluatedOnce.kt") + public void testSubjectExpressionIsEvaluatedOnce() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt"); + } + @TestMetadata("whenByEnum.kt") public void testWhenByEnum() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/whenByEnum.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index ef4ca5ad912..57fd9fc98ec 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -20723,6 +20723,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/sparseIntSwitchWithSubjectVariable.kt"); } + @TestMetadata("subjectExpressionIsEvaluatedOnce.kt") + public void testSubjectExpressionIsEvaluatedOnce() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt"); + } + @TestMetadata("whenByEnum.kt") public void testWhenByEnum() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/whenByEnum.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index c4c6f68e88d..1578a51d109 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -19601,6 +19601,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/sparseIntSwitchWithSubjectVariable.kt"); } + @TestMetadata("subjectExpressionIsEvaluatedOnce.kt") + public void testSubjectExpressionIsEvaluatedOnce() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/subjectExpressionIsEvaluatedOnce.kt"); + } + @TestMetadata("whenByEnum.kt") public void testWhenByEnum() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/whenByEnum.kt");