fix corner case in `reduce_vars` (#3623)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 4 Dec 2019 12:24:55 +0000 (20:24 +0800)
committerGitHub <noreply@github.com>
Wed, 4 Dec 2019 12:24:55 +0000 (20:24 +0800)
fixes #3622

lib/compress.js
test/compress/reduce_vars.js

index e18fd57..4442bbb 100644 (file)
@@ -701,8 +701,11 @@ merge(Compressor.prototype, {
                 node.argnames.forEach(function(arg, i) {
                     var d = arg.definition();
                     if (d.fixed === undefined && (!node.uses_arguments || tw.has_directive("use strict"))) {
+                        var value = iife.args[i];
                         d.fixed = function() {
-                            return iife.args[i] || make_node(AST_Undefined, iife);
+                            var j = node.argnames.indexOf(arg);
+                            if (j < 0) return value;
+                            return iife.args[j] || make_node(AST_Undefined, iife);
                         };
                         tw.loop_ids[d.id] = tw.in_loop;
                         mark(tw, d, true);
index a3421c0..443c347 100644 (file)
@@ -6774,3 +6774,30 @@ issue_3509: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3622: {
+    options = {
+        evaluate: true,
+        inline: true,
+        keep_fargs: "strict",
+        reduce_vars: true,
+        sequences: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var c = "FAIL";
+        !function(b, a) {
+            a && (c = "PASS");
+        }(42, this);
+        console.log(c);
+    }
+    expect: {
+        var c = "FAIL";
+        var a;
+        a = this,
+        !void (a && (c = "PASS")),
+        console.log(c);
+    }
+    expect_stdout: "PASS"
+}