fix corner case in `switches` (#4060)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 21 Aug 2020 00:05:10 +0000 (01:05 +0100)
committerGitHub <noreply@github.com>
Fri, 21 Aug 2020 00:05:10 +0000 (08:05 +0800)
fixes #4059

lib/compress.js
test/compress/switch.js

index 8bc8b37..f15776c 100644 (file)
@@ -5918,7 +5918,7 @@ merge(Compressor.prototype, {
         self.body = body;
         if (compressor.option("conditionals")) switch (body.length) {
           case 1:
-            if (!no_break(self)) break;
+            if (!no_break(body[0])) break;
             var exp = body[0].expression;
             var statements = body[0].body.slice();
             if (body[0] !== default_branch && body[0] !== exact_match) return make_node(AST_If, self, {
@@ -5942,7 +5942,7 @@ merge(Compressor.prototype, {
                 body: statements,
             }).optimize(compressor);
           case 2:
-            if (!member(default_branch, body)) break;
+            if (!member(default_branch, body) || !no_break(body[1])) break;
             var statements = body[0].body.slice();
             var exclusive = statements.length && is_break(statements[statements.length - 1], compressor);
             if (exclusive) statements.pop();
@@ -5982,6 +5982,7 @@ merge(Compressor.prototype, {
                     || node instanceof AST_SimpleStatement) return true;
                 if (is_break(node, tw)) found = true;
             });
+            tw.push(self);
             node.walk(tw);
             return !found;
         }
index 83bc40f..e3f6859 100644 (file)
@@ -1150,3 +1150,34 @@ drop_switch_8: {
         (C !== D ? y : z)();
     }
 }
+
+issue_4059: {
+    options = {
+        conditionals: true,
+        dead_code: true,
+        evaluate: true,
+        switches: true,
+    }
+    input: {
+        switch (0) {
+          default:
+          case 1:
+            break;
+          case a:
+            break;
+            var a;
+        }
+        console.log("PASS");
+    }
+    expect: {
+        switch (0) {
+          default:
+            break;
+          case a:
+            break;
+            var a;
+        }
+        console.log("PASS");
+    }
+    expect_stdout: "PASS"
+}