fix corner case in `hoist_props` (#5223)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 15 Dec 2021 18:57:34 +0000 (18:57 +0000)
committerGitHub <noreply@github.com>
Wed, 15 Dec 2021 18:57:34 +0000 (02:57 +0800)
fixes #5222

lib/ast.js
lib/compress.js
test/compress/default-values.js

index b8732a7..1213852 100644 (file)
@@ -1537,6 +1537,12 @@ var AST_Assign = DEFNODE("Assign", null, {
                     throw new Error("left must be assignable: " + node.TYPE);
                 }
             });
+        } else if (!(this.left instanceof AST_Infinity
+            || this.left instanceof AST_NaN
+            || this.left instanceof AST_PropAccess && !this.left.optional
+            || this.left instanceof AST_SymbolRef
+            || this.left instanceof AST_Undefined)) {
+            throw new Error("left must be assignable");
         }
     },
 }, AST_Binary);
index ef84a75..cf8c7eb 100644 (file)
@@ -7795,6 +7795,7 @@ Compressor.prototype.compress = function(node) {
                 var defs = defs_by_id[node.definition().id];
                 if (!defs) return;
                 if (node.fixed_value() !== defs.value) return;
+                if (is_lhs(node, this.parent())) return;
                 return make_node(AST_Object, node, { properties: [] });
             }
         }));
index 260a35d..5fc6981 100644 (file)
@@ -1957,3 +1957,37 @@ issue_5192: {
     expect_stdout: "PASS"
     node_version: ">=6"
 }
+
+issue_5222: {
+    options = {
+        hoist_props: true,
+        inline: true,
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f() {
+            do {
+                (function() {
+                    var a = {
+                        p: [ a ] = [],
+                    };
+                })();
+            } while (console.log("PASS"));
+        }
+        f();
+    }
+    expect: {
+        (function() {
+            do {
+                a = void 0,
+                [ a ] = [];
+            } while (console.log("PASS"));
+            var a;
+        })();
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}