fix corner case in `collapse_vars` (#3334)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 14 Mar 2019 08:05:56 +0000 (16:05 +0800)
committerGitHub <noreply@github.com>
Thu, 14 Mar 2019 08:05:56 +0000 (16:05 +0800)
fixes #3274

lib/compress.js
test/compress/functions.js

index 2ccf330..04adb8b 100644 (file)
@@ -1585,13 +1585,19 @@ merge(Compressor.prototype, {
                 var found = false;
                 return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) {
                     if (found) return node;
-                    if (node === expr || node.body === expr) {
+                    if (node !== expr && node.body !== expr) return;
+                    if (node instanceof AST_VarDef) {
                         found = true;
-                        if (node instanceof AST_VarDef) {
-                            node.value = null;
-                            return node;
-                        }
-                        return in_list ? MAP.skip : null;
+                        node.value = null;
+                        return node;
+                    }
+                    if (in_list) {
+                        found = true;
+                        return MAP.skip;
+                    }
+                    if (!this.parent()) {
+                        found = true;
+                        return null;
                     }
                 }, function(node) {
                     if (node instanceof AST_Sequence) switch (node.expressions.length) {
index 96689ea..96a58aa 100644 (file)
@@ -2315,3 +2315,33 @@ issue_3125: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3274: {
+    options = {
+        collapse_vars: true,
+        inline: true,
+        join_vars: true,
+        loops: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        (function() {
+            var g = function(a) {
+                var c = a.p, b = c;
+                return b != c;
+            };
+            while (g(1))
+                console.log("FAIL");
+            console.log("PASS");
+        })();
+    }
+    expect: {
+        (function() {
+            for (var c; void 0, (c = 1..p) != c;)
+                console.log("FAIL");
+            console.log("PASS");
+        })();
+    }
+    expect_stdout: "PASS"
+}