fix corner case in `merge_vars` (#4104)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 15 Sep 2020 11:47:12 +0000 (12:47 +0100)
committerGitHub <noreply@github.com>
Tue, 15 Sep 2020 11:47:12 +0000 (19:47 +0800)
fixes #4103

lib/compress.js
test/compress/merge_vars.js

index 171746a..b605dda 100644 (file)
@@ -4315,10 +4315,11 @@ merge(Compressor.prototype, {
         var prev = Object.create(null);
         var tw = new TreeWalker(function(node, descend) {
             if (node instanceof AST_Assign) {
+                if (node.operator != "=") return;
                 var sym = node.left;
                 if (!(sym instanceof AST_SymbolRef)) return;
                 node.right.walk(tw);
-                mark(sym, node.operator == "=");
+                mark(sym, true);
                 return true;
             }
             if (node instanceof AST_Binary) {
index 076668e..6923fe7 100644 (file)
@@ -260,3 +260,30 @@ read_before_assign_2: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4103: {
+    options = {
+        merge_vars: true,
+        side_effects: true,
+        toplevel: true,
+    }
+    input: {
+        function f(a) {
+            console.log(a);
+        }
+        var b = 0;
+        var c = f(b++ + (c %= 1 >> console.log(c = 0)));
+        b;
+    }
+    expect: {
+        function f(a) {
+            console.log(a);
+        }
+        var b = 0;
+        var c = f(b++ + (c %= 1 >> console.log(c = 0)));
+    }
+    expect_stdout: [
+        "0",
+        "NaN",
+    ]
+}