fix corner case in `conditionals` & `side_effects` (#4669)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 20 Feb 2021 03:13:15 +0000 (03:13 +0000)
committerGitHub <noreply@github.com>
Sat, 20 Feb 2021 03:13:15 +0000 (11:13 +0800)
fixes #4668

lib/compress.js
test/compress/side_effects.js

index c3e315d..da30cee 100644 (file)
@@ -5788,15 +5788,12 @@ merge(Compressor.prototype, {
                         if (!in_use || node.left === sym && indexOf_assign(def, node) < 0) {
                             value = get_rhs(node);
                             if (node.write_only === true) {
-                                value = value.drop_side_effect_free(compressor) || make_node(AST_Number, node, {
-                                    value: 0
-                                });
+                                value = value.drop_side_effect_free(compressor)
+                                    || make_node(AST_Number, node, { value: 0 });
                             }
                         }
                     } else if (!in_use || node.expression === sym && indexOf_assign(def, node) < 0) {
-                        value = make_node(AST_Number, node, {
-                            value: 0
-                        });
+                        value = make_node(AST_Number, node, { value: 0 });
                     }
                     if (value) {
                         if (parent instanceof AST_Sequence && parent.tail_node() !== node) {
@@ -7168,7 +7165,7 @@ merge(Compressor.prototype, {
                 assign = assign.clone();
                 assign.right = cond;
                 expressions = expressions.slice(0, -2);
-                expressions.push(assign);
+                expressions.push(assign.drop_side_effect_free(compressor, first_in_statement));
             }
             return expressions === this.expressions ? this : make_sequence(this, expressions);
         });
index 177cf50..994e884 100644 (file)
@@ -506,3 +506,34 @@ issue_4366_2: {
     expect_stdout: "PASS"
     node_version: ">=4"
 }
+
+issue_4668: {
+    options = {
+        conditionals: true,
+        keep_fargs: false,
+        keep_fnames: true,
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f(a) {
+            var b, c;
+            function g() {
+                return a = 0 + a, !d || (a = 0);
+            }
+            c = g();
+        }
+        console.log(f());
+        var d = 0;
+    }
+    expect: {
+        console.log(function f() {
+            (function g() {
+                0;
+            })();
+        }());
+    }
+    expect_stdout: "undefined"
+}