fix corner case in `unused` (#4185)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 5 Oct 2020 10:59:03 +0000 (11:59 +0100)
committerGitHub <noreply@github.com>
Mon, 5 Oct 2020 10:59:03 +0000 (18:59 +0800)
fixes #4184

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

index fbd0774..8c28d45 100644 (file)
@@ -5133,6 +5133,13 @@ merge(Compressor.prototype, {
             return rhs.right;
         }
 
+        function cross_scope(def, sym) {
+            do {
+                if (def === sym) return false;
+                if (sym instanceof AST_Scope) return true;
+            } while (sym = sym.parent_scope);
+        }
+
         function scan_ref_scoped(node, descend, init) {
             if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef) {
                 var def = node.left.definition();
@@ -5186,7 +5193,7 @@ merge(Compressor.prototype, {
                     in_use_ids[node_def.id] = true;
                     in_use.push(node_def);
                 }
-                if (node.scope !== node_def.scope) {
+                if (cross_scope(node_def.scope, node.scope)) {
                     var redef = node_def.redefined();
                     if (redef && !(redef.id in in_use_ids)) {
                         in_use_ids[redef.id] = true;
index 616bcaf..257d7a7 100644 (file)
@@ -3055,3 +3055,33 @@ single_use_catch_redefined: {
     }
     expect_stdout: true
 }
+
+issue_4184: {
+    options = {
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        (function() {
+            var a = function() {}, b = [ a, 1 && b, a = {} ];
+            try {
+                throw 42;
+            } catch (a) {
+                {
+                    console.log(a);
+                }
+            }
+        })();
+    }
+    expect: {
+        (function() {
+            var b = [ function() {}, 1 && b, {} ];
+            try {
+                throw 42;
+            } catch (a) {
+                console.log(a);
+            }
+        })();
+    }
+    expect_stdout: "42"
+}