fix corner case in `dead_code` (#3991)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 12 Jun 2020 00:00:19 +0000 (01:00 +0100)
committerGitHub <noreply@github.com>
Fri, 12 Jun 2020 00:00:19 +0000 (08:00 +0800)
lib/compress.js
test/compress/dead-code.js

index 2a1399d..a3a4a63 100644 (file)
@@ -7865,12 +7865,10 @@ merge(Compressor.prototype, {
             if (self.left instanceof AST_PropAccess) {
                 if (self.operator == "=") {
                     if (self.__drop) {
-                        var props = [];
-                        flatten(self.left, props);
-                        flatten(self.right, props);
-                        return props.length == 0 ? make_node(AST_Number, self, {
-                            value: 0
-                        }) : make_sequence(self, props).optimize(compressor);
+                        var exprs = [ self.left.expression ];
+                        if (self.left instanceof AST_Sub) exprs.push(self.left.property);
+                        exprs.push(self.right);
+                        return make_sequence(self, exprs).optimize(compressor);
                     }
                     if (self.left.equivalent_to(self.right) && !self.left.has_side_effects(compressor)) {
                         return self.right;
@@ -7962,11 +7960,6 @@ merge(Compressor.prototype, {
         }
         return try_evaluate(compressor, self);
 
-        function flatten(node, props) {
-            if (!(node.expression instanceof AST_SymbolRef)) props.push(node.expression);
-            if (node instanceof AST_Sub) props.push(node.property);
-        }
-
         function in_try(level, node) {
             var right = self.right;
             self.right = make_node(AST_Null, right);
index a2ebf37..4f73187 100644 (file)
@@ -1290,12 +1290,37 @@ self_assignments_5: {
     }
     expect: {
         var i = 0, l = [ "FAIL", "PASS" ];
+        l[0];
+        l[0];
         l[0] = l[1];
         console.log(l[0], 2);
     }
     expect_stdout: "PASS 2"
 }
 
+self_assignments_6: {
+    options = {
+        dead_code: true,
+        pure_getters: "strict",
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+    }
+    input: {
+        var o = {
+            p: "PASS",
+        };
+        console.log(o.p = o.p);
+    }
+    expect: {
+        var o = {
+            p: "PASS",
+        };
+        console.log(o.p);
+    }
+    expect_stdout: "PASS"
+}
+
 issue_3967: {
     options = {
         dead_code: true,