fix corner case in `unused` (#3987)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 10 Jun 2020 18:01:23 +0000 (19:01 +0100)
committerGitHub <noreply@github.com>
Wed, 10 Jun 2020 18:01:23 +0000 (02:01 +0800)
fixes #3986

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

index 03432be..0eaa3a4 100644 (file)
@@ -4674,9 +4674,13 @@ merge(Compressor.prototype, {
             var rhs = assign.right;
             if (!assign.write_only) return rhs;
             if (!(rhs instanceof AST_Binary && lazy_op[rhs.operator])) return rhs;
-            var sym = assign.left;
-            if (!(sym instanceof AST_SymbolRef) || sym.name != rhs.left.name) return rhs;
-            return rhs.right.has_side_effects(compressor) ? rhs : rhs.right;
+            if (!(rhs.left instanceof AST_SymbolRef)) return rhs;
+            if (!(assign.left instanceof AST_SymbolRef)) return rhs;
+            var def = assign.left.definition();
+            if (rhs.left.definition() !== def) return rhs;
+            if (rhs.right.has_side_effects(compressor)) return rhs;
+            if (track_assigns(def, rhs.left)) add_assigns(def, rhs.left);
+            return rhs.right;
         }
 
         function scan_ref_scoped(node, descend, init) {
index 8c912a5..b66320a 100644 (file)
@@ -2755,3 +2755,37 @@ issue_3962_2: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3986: {
+    options = {
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = 0, b = 0;
+        (function() {
+            try {
+                throw 42;
+            } catch (e) {
+                a++;
+            }
+            b = b && 0;
+        })(b *= a);
+        console.log(b);
+    }
+    expect: {
+        var a = 0, b = 0;
+        (function() {
+            try {
+                throw 42;
+            } catch (e) {
+                a++;
+            }
+            b = b && 0;
+        })(b *= a);
+        console.log(b);
+    }
+    expect_stdout: "0"
+}