From 969993bd093402e1170e4c9c107a94fbcb868a0e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 May 2015 14:35:54 +0300 Subject: [PATCH] Fix for EA-68871 #EA-68871 Fixed --- .../codegen/when/SwitchCodegenUtil.java | 2 +- .../org/jetbrains/kotlin/cfg/WhenChecker.java | 9 +++-- .../when/EmptyConditionWithExpression.kt | 8 ++++ .../when/EmptyConditionWithExpression.txt | 3 ++ .../when/EmptyConditionWithExpressionEnum.kt | 9 +++++ .../when/EmptyConditionWithExpressionEnum.txt | 37 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 12 ++++++ 7 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.kt create mode 100644 compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.txt create mode 100644 compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.kt create mode 100644 compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegenUtil.java index d47bf2a8749..de79f42bd81 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/SwitchCodegenUtil.java @@ -47,7 +47,7 @@ public class SwitchCodegenUtil { // ensure that expression is constant JetExpression patternExpression = ((JetWhenConditionWithExpression) condition).getExpression(); - assert patternExpression != null : "expression in when should not be null"; + if (patternExpression == null) return false; CompileTimeConstant constant = ExpressionCodegen.getCompileTimeConstant(patternExpression, bindingContext); if (constant == null || !predicate.invoke(constant)) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.java index 2fe0360422f..4c0d3df6e31 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.java @@ -149,9 +149,12 @@ public final class WhenChecker { for (JetWhenEntry entry : expression.getEntries()) { for (JetWhenCondition condition : entry.getConditions()) { if (condition instanceof JetWhenConditionWithExpression) { - JetType type = trace.getBindingContext().getType(((JetWhenConditionWithExpression) condition).getExpression()); - if (type != null && KotlinBuiltIns.isNothingOrNullableNothing(type)) { - return true; + JetWhenConditionWithExpression conditionWithExpression = (JetWhenConditionWithExpression) condition; + if (conditionWithExpression.getExpression() != null) { + JetType type = trace.getBindingContext().getType(conditionWithExpression.getExpression()); + if (type != null && KotlinBuiltIns.isNothingOrNullableNothing(type)) { + return true; + } } } } diff --git a/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.kt b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.kt new file mode 100644 index 00000000000..4683fbbb7b2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.kt @@ -0,0 +1,8 @@ +// EA-68871: empty when condition +fun foo(arg: Int): Int { + when (arg) { + 0 -> return 0 + -> return 4 + else -> return -1 + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.txt b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.txt new file mode 100644 index 00000000000..57128acc68f --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.txt @@ -0,0 +1,3 @@ +package + +internal fun foo(/*0*/ arg: kotlin.Int): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.kt b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.kt new file mode 100644 index 00000000000..9746ea53b58 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.kt @@ -0,0 +1,9 @@ +// EA-68871: empty when condition +enum class My { FIRST, SECOND } +fun foo(arg: My): Int { + when (arg) { + My.FIRST -> return 0 + -> return 4 + else -> return -1 + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.txt b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.txt new file mode 100644 index 00000000000..3f3fbb3e5f4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.txt @@ -0,0 +1,37 @@ +package + +internal fun foo(/*0*/ arg: My): kotlin.Int + +internal final enum class My : kotlin.Enum { + public enum entry FIRST : My { + private constructor FIRST() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: My): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry SECOND : My { + private constructor SECOND() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: My): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + private constructor My() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: My): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): My + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index b9ebe49aeb1..f3b9c0ca615 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -13584,6 +13584,18 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("EmptyConditionWithExpression.kt") + public void testEmptyConditionWithExpression() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/EmptyConditionWithExpression.kt"); + doTest(fileName); + } + + @TestMetadata("EmptyConditionWithExpressionEnum.kt") + public void testEmptyConditionWithExpressionEnum() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/EmptyConditionWithExpressionEnum.kt"); + doTest(fileName); + } + @TestMetadata("ExhaustiveBoolean.kt") public void testExhaustiveBoolean() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/ExhaustiveBoolean.kt");