fix corner case in `unused` (#4018)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 21 Jul 2020 00:06:42 +0000 (01:06 +0100)
committeralexlamsl <alexlamsl@gmail.com>
Tue, 21 Jul 2020 09:21:58 +0000 (17:21 +0800)
fixes #4017

lib/compress.js
test/compress/drop-unused.js

index a464b66..8ea5d8c 100644 (file)
@@ -4456,8 +4456,13 @@ merge(Compressor.prototype, {
                     var sym = def.name.definition();
                     if (!drop_vars || sym.id in in_use_ids) {
                         if (def.value && indexOf_assign(sym, def) < 0) {
-                            def.value = def.value.drop_side_effect_free(compressor);
-                            if (def.value) def.value.tail_node().write_only = false;
+                            var value = def.value.drop_side_effect_free(compressor);
+                            if (def.value !== value) def.value = value && make_sequence(def.value, [
+                                value,
+                                make_node(AST_Number, def.value, {
+                                    value: 0
+                                }),
+                            ]);
                         }
                         var old_def, var_defs = var_defs_by_id.get(sym.id);
                         if (!def.value) {
index b66320a..2672175 100644 (file)
@@ -2718,7 +2718,7 @@ issue_3962_1: {
                 0..toString();
             } while (0);
             if (c) console.log("PASS");
-        })((a--, 1));
+        }((a--, 1)), 0);
         void 0;
     }
     expect_stdout: "PASS"
@@ -2751,7 +2751,7 @@ issue_3962_2: {
                 0..toString();
             } while (0);
             if (c) console.log("PASS");
-        })((a--, 1));
+        }((a--, 1)), 0);
     }
     expect_stdout: "PASS"
 }
@@ -2789,3 +2789,27 @@ issue_3986: {
     }
     expect_stdout: "0"
 }
+
+issue_4017: {
+    options = {
+        pure_getters: "strict",
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        var a = 0;
+        console.log(function f() {
+            var b = c &= 0;
+            var c = a++ + (A = a);
+            var d = c && c[f];
+        }());
+    }
+    expect: {
+        var a = 0;
+        console.log(function() {
+            c &= 0;
+            var c = (a++, A = a, 0);
+        }());
+    }
+    expect_stdout: "undefined"
+}