fix corner case in `evaluate` (#3946)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 2 Jun 2020 15:50:40 +0000 (16:50 +0100)
committerGitHub <noreply@github.com>
Tue, 2 Jun 2020 15:50:40 +0000 (23:50 +0800)
fixes #3944

lib/compress.js
test/compress/evaluate.js

index 3728884..cfe37d0 100644 (file)
@@ -3308,7 +3308,7 @@ merge(Compressor.prototype, {
             }
             var op = this.operator;
             var node;
-            if (HOP(lhs, "_eval") || !(lhs instanceof AST_SymbolRef) || !lhs.fixed_value()) {
+            if (HOP(lhs, "_eval") || !(lhs instanceof AST_SymbolRef) || !lhs.fixed || !lhs.definition().fixed) {
                 node = op == "=" ? this.right : make_node(AST_Binary, this, {
                     operator: op.slice(0, -1),
                     left: lhs,
index 6deabaf..4e3bc72 100644 (file)
@@ -2690,3 +2690,32 @@ issue_3937: {
     }
     expect_stdout: "124 124"
 }
+
+issue_3944: {
+    options = {
+        collapse_vars: true,
+        evaluate: true,
+        inline: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        (function() {
+            function f() {
+                while (function() {
+                    var a = 0 == (b && b.p), b = console.log(a);
+                }());
+                f;
+            }
+            f();
+        })();
+    }
+    expect: {
+        void function f() {
+            while (a = 0 == (a = void 0), console.log(a), void 0);
+            var a;
+            f;
+        }();
+    }
+    expect_stdout: "false"
+}