fix corner case in `dead_code` (#5154)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 24 Oct 2021 22:18:16 +0000 (06:18 +0800)
committerGitHub <noreply@github.com>
Sun, 24 Oct 2021 22:18:16 +0000 (06:18 +0800)
fixes #5153

lib/compress.js
test/compress/destructured.js

index a718410..7d1e6fd 100644 (file)
@@ -11562,16 +11562,14 @@ merge(Compressor.prototype, {
                     node = parent;
                     parent = compressor.parent(level++);
                     if (parent instanceof AST_Assign) {
-                        var found = false;
+                        if (parent.left instanceof AST_SymbolRef && parent.left.definition() === def) {
+                            if (in_try(level, parent)) break;
+                            return strip_assignment(def);
+                        }
                         if (parent.left.match_symbol(function(node) {
                             if (node instanceof AST_PropAccess) return true;
-                            if (!found && node instanceof AST_SymbolRef && node.definition() === def) {
-                                if (in_try(level, parent)) return true;
-                                found = true;
-                            }
                         })) break;
-                        if (!found) continue;
-                        return strip_assignment(def);
+                        continue;
                     }
                     if (parent instanceof AST_Exit) {
                         if (!local) break;
index 6716f9e..87d7e1b 100644 (file)
@@ -2127,7 +2127,7 @@ issue_4372_2: {
     }
     expect: {
         var a;
-        [ a ] = [ "PASS", "FAIL" ];
+        [ a ] = a = [ "PASS", "FAIL" ];
         console.log(a);
     }
     expect_stdout: "PASS"
@@ -3125,3 +3125,103 @@ issue_5114_3: {
     expect_stdout: "PASS"
     node_version: ">=6"
 }
+
+issue_5153_array_assign: {
+    options = {
+        dead_code: true,
+    }
+    input: {
+        var a = function*() {
+            yield b;
+        }(), b;
+        [ b ] = b = a;
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect: {
+        var a = function*() {
+            yield b;
+        }(), b;
+        [ b ] = b = a;
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+issue_5153_array_var: {
+    options = {
+        dead_code: true,
+    }
+    input: {
+        var a = function*() {
+            yield b;
+        }(), [ b ] = b = a;
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect: {
+        var a = function*() {
+            yield b;
+        }(), [ b ] = b = a;
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+issue_5153_object_assign: {
+    options = {
+        dead_code: true,
+    }
+    input: {
+        var a = {
+            get p() {
+                return b;
+            },
+        }, b;
+        ({
+            p: b
+        } = b = a);
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect: {
+        var a = {
+            get p() {
+                return b;
+            },
+        }, b;
+        ({
+            p: b
+        } = b = a);
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+issue_5153_object_var: {
+    options = {
+        dead_code: true,
+    }
+    input: {
+        var a = {
+            get p() {
+                return b;
+            },
+        }, {
+            p: b
+        } = b = a;
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect: {
+        var a = {
+            get p() {
+                return b;
+            },
+        }, {
+            p: b
+        } = b = a;
+        console.log(a === b ? "PASS" : "FAIL");
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}