fix corner case in `merge_vars` (#4136)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 20 Sep 2020 15:54:14 +0000 (16:54 +0100)
committerGitHub <noreply@github.com>
Sun, 20 Sep 2020 15:54:14 +0000 (23:54 +0800)
fixes #4135

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

index 2df76f5..82bbbf1 100644 (file)
@@ -4485,9 +4485,12 @@ merge(Compressor.prototype, {
             var head = first.pop();
             var def = head.definition;
             if (!(def.id in prev)) continue;
-            var head_refs = references[def.id];
-            if (!head_refs) continue;
+            if (!references[def.id]) continue;
+            var head_refs = {
+                start: references[def.id].start,
+            };
             while (def.id in merged) def = merged[def.id];
+            head_refs.end = references[def.id].end;
             var skipped = [];
             do {
                 var tail = last.pop();
index d48b117..b5b7101 100644 (file)
@@ -2701,3 +2701,40 @@ issue_4130: {
         "1",
     ]
 }
+
+issue_4135: {
+    options = {
+        evaluate: true,
+        inline: true,
+        merge_vars: true,
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = 0, b = 0;
+        --b;
+        a++;
+        if (!a)
+            var c = function() {
+                var d = 0;
+                function f() {
+                    d && d.p;
+                }
+                f();
+                this;
+            }(a++);
+        console.log(a, b, c);
+    }
+    expect: {
+        var a = 0;
+        0;
+        a++;
+        if (!a)
+            c = (a++, c = 0, void (c && c.p));
+        var c;
+        console.log(a, -1, c);
+    }
+    expect_stdout: "1 -1 undefined"
+}