diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegen.kt index e05d84a9da0..cc78eb8a6cf 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegen.kt @@ -91,6 +91,7 @@ abstract class SwitchCodegen( v.mark(endLabel) subjectVariableDescriptor?.let { + codegen.frameMap.leave(it) v.visitLocalVariable( it.name.asString(), subjectType.descriptor, null, beginLabel, endLabel, subjectLocal diff --git a/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt new file mode 100644 index 00000000000..18862bde022 --- /dev/null +++ b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt @@ -0,0 +1,13 @@ +enum class Test { + A, B, OTHER +} + +fun peek() = Test.A + +fun box(): String { + val x = when (val type = peek()) { + Test.A -> "OK" + else -> "other" + } + return x +} diff --git a/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt new file mode 100644 index 00000000000..9dbe1156a98 --- /dev/null +++ b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt @@ -0,0 +1,10 @@ +fun peek() = 1 + +fun box(): String { + val x = when (val x = peek()) { + 1 -> "OK" + 2 -> "2" + else -> "other $x" + } + return x +} diff --git a/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt new file mode 100644 index 00000000000..e75b6085120 --- /dev/null +++ b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt @@ -0,0 +1,25 @@ +enum class Test { + A, B, OTHER +} + +fun peek() = Test.A + +fun box(): String { + val x = when (val t1 = peek()) { + Test.A -> { + val y = peek() + when (val t2 = y) { + Test.A -> + when (val t3 = peek()) { + Test.A -> "OK" + else -> "other 3" + } + + else -> "other 2" + } + } + + else -> "other 1" + } + return x +} diff --git a/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt new file mode 100644 index 00000000000..f0dbde680a1 --- /dev/null +++ b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt @@ -0,0 +1,30 @@ +enum class Test { + A, B, OTHER +} + +fun peek() = Test.A + +fun box(): String { + val x = when (val t1 = peek()) { + Test.A -> { + when ( + val t2 = when(val y = peek()) { + Test.A -> Test.A + Test.B -> Test.B + else -> Test.OTHER + } + ) { + Test.A -> + when (val t3 = peek()) { + Test.A -> "OK" + else -> "other 3" + } + + else -> "other 2" + } + } + + else -> "other 1" + } + return x +} diff --git a/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt new file mode 100644 index 00000000000..a9eab8b3710 --- /dev/null +++ b/compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt @@ -0,0 +1,10 @@ +fun peek() = "A" + +fun box(): String { + val x = when (val s = peek()) { + "A" -> "OK" + "B" -> "B" + else -> "other $s" + } + return x +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 332cb0f958a..9d1f59c3bc6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -23239,6 +23239,31 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt"); } + @TestMetadata("kt27161.kt") + public void testKt27161() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt"); + } + + @TestMetadata("kt27161_int.kt") + public void testKt27161_int() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt"); + } + + @TestMetadata("kt27161_nested.kt") + public void testKt27161_nested() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt"); + } + + @TestMetadata("kt27161_nested2.kt") + public void testKt27161_nested2() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt"); + } + + @TestMetadata("kt27161_string.kt") + public void testKt27161_string() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt"); + } + @TestMetadata("rangeCheckOnSubjectVariable.kt") public void testRangeCheckOnSubjectVariable() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index d32730955e6..2f7747e77a1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23239,6 +23239,31 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt"); } + @TestMetadata("kt27161.kt") + public void testKt27161() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt"); + } + + @TestMetadata("kt27161_int.kt") + public void testKt27161_int() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt"); + } + + @TestMetadata("kt27161_nested.kt") + public void testKt27161_nested() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt"); + } + + @TestMetadata("kt27161_nested2.kt") + public void testKt27161_nested2() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt"); + } + + @TestMetadata("kt27161_string.kt") + public void testKt27161_string() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt"); + } + @TestMetadata("rangeCheckOnSubjectVariable.kt") public void testRangeCheckOnSubjectVariable() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 0a8526b108b..cb6941eefa3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -23244,6 +23244,31 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt"); } + @TestMetadata("kt27161.kt") + public void testKt27161() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt"); + } + + @TestMetadata("kt27161_int.kt") + public void testKt27161_int() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt"); + } + + @TestMetadata("kt27161_nested.kt") + public void testKt27161_nested() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt"); + } + + @TestMetadata("kt27161_nested2.kt") + public void testKt27161_nested2() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt"); + } + + @TestMetadata("kt27161_string.kt") + public void testKt27161_string() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt"); + } + @TestMetadata("rangeCheckOnSubjectVariable.kt") public void testRangeCheckOnSubjectVariable() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.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 64c751bd736..0a99527013e 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 @@ -21059,6 +21059,31 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt"); } + @TestMetadata("kt27161.kt") + public void testKt27161() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt"); + } + + @TestMetadata("kt27161_int.kt") + public void testKt27161_int() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt"); + } + + @TestMetadata("kt27161_nested.kt") + public void testKt27161_nested() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt"); + } + + @TestMetadata("kt27161_nested2.kt") + public void testKt27161_nested2() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt"); + } + + @TestMetadata("kt27161_string.kt") + public void testKt27161_string() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt"); + } + @TestMetadata("rangeCheckOnSubjectVariable.kt") public void testRangeCheckOnSubjectVariable() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.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 eb7af434dd3..4598fea5774 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 @@ -22104,6 +22104,31 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt"); } + @TestMetadata("kt27161.kt") + public void testKt27161() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt"); + } + + @TestMetadata("kt27161_int.kt") + public void testKt27161_int() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt"); + } + + @TestMetadata("kt27161_nested.kt") + public void testKt27161_nested() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt"); + } + + @TestMetadata("kt27161_nested2.kt") + public void testKt27161_nested2() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt"); + } + + @TestMetadata("kt27161_string.kt") + public void testKt27161_string() throws Exception { + runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt"); + } + @TestMetadata("rangeCheckOnSubjectVariable.kt") public void testRangeCheckOnSubjectVariable() throws Exception { runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt");