fix corner case in `loops` & `unused` (#4085)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 1 Sep 2020 19:20:58 +0000 (20:20 +0100)
committerGitHub <noreply@github.com>
Tue, 1 Sep 2020 19:20:58 +0000 (03:20 +0800)
fixes #4084

lib/compress.js
test/compress/loops.js

index bab390c..2c21217 100644 (file)
@@ -4682,8 +4682,8 @@ merge(Compressor.prototype, {
                 }
                 var def = sym.definition();
                 if (!def) return;
-                if (def.scope !== self) return;
                 if (def.id in in_use_ids) return;
+                if (def.scope !== self && member(def, self.enclosed)) return;
                 log(sym, "Dropping unused loop variable {name}");
                 var value = node.object.drop_side_effect_free(compressor);
                 if (!value) return in_list ? List.skip : make_node(AST_EmptyStatement, node);
index e24b371..878b77c 100644 (file)
@@ -1009,3 +1009,31 @@ issue_4082: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4084: {
+    options = {
+        keep_fargs: "strict",
+        loops: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        console.log(function() {
+            function f(a) {
+                var b = a++;
+                for (a in "foo");
+            }
+            f();
+            return typeof a;
+        }());
+    }
+    expect: {
+        console.log(function() {
+            (function() {
+                0;
+            })();
+            return typeof a;
+        }());
+    }
+    expect_stdout: "undefined"
+}