summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-02-19 15:31:15 +0100
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-02-19 15:31:15 +0100
commite26fd721b9d4f902be68a93836e21e05ddbda931 (patch)
treec6f3f998b6705161464eec8a44a50fe508d1583e /src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
parent3973f29cec9f06724941b68577908f546341c45e (diff)
downloadscala-e26fd721b9d4f902be68a93836e21e05ddbda931.tar.gz
scala-e26fd721b9d4f902be68a93836e21e05ddbda931.tar.bz2
scala-e26fd721b9d4f902be68a93836e21e05ddbda931.zip
SI-8306: handle SWITCH nodes with just default case
Handle properly SWITCH nodes that contain just a default case in optimizer (ConstantOptimization). SWITCH with just default case is expressed as a node with empty tags and exactly one label. We can handle such nodes easily by introducing a shortcut in logic that computes reachableLabels. Add a test case which triggers patmat to generate SWITCH node with just a default case. Fixes SI-8306.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
index 64a0727440..1fadcb8920 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
@@ -492,7 +492,10 @@ abstract class ConstantOptimization extends SubComponent {
case SWITCH(tags, labels) =>
val in1 = in peek 0
val reachableNormalLabels = tags zip labels collect { case (tagSet, label) if canSwitch(in1, tagSet) => label }
- val reachableLabels = if (labels.lengthCompare(tags.length) > 0) {
+ val reachableLabels = if (tags.isEmpty) {
+ assert(labels.size == 1, s"When SWITCH node has empty array of tags it should have just one (default) label: $labels")
+ labels
+ } else if (labels.lengthCompare(tags.length) > 0) {
// if we've got an extra label then it's the default
val defaultLabel = labels.last
// see if the default is reachable by seeing if the input might be out of the set