fix corner cases with rest parameters (#4526)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 9 Jan 2021 00:38:51 +0000 (00:38 +0000)
committerGitHub <noreply@github.com>
Sat, 9 Jan 2021 00:38:51 +0000 (08:38 +0800)
fixes #4525

lib/compress.js
test/compress/rests.js

index 8652d6e..8aef5a7 100644 (file)
@@ -5669,8 +5669,9 @@ merge(Compressor.prototype, {
                     }
                     if (node.rest) {
                         node.rest = node.rest.transform(trimmer);
-                        if (node.rest instanceof AST_DestructuredArray && node.rest.elements.length == 0
-                            || node.rest instanceof AST_DestructuredObject && node.rest.properties.length == 0) {
+                        if (!(node.uses_arguments && !tt.has_directive("use strict"))
+                            && (node.rest instanceof AST_DestructuredArray && node.rest.elements.length == 0
+                                || node.rest instanceof AST_DestructuredObject && node.rest.properties.length == 0)) {
                             node.rest = null;
                         }
                     }
@@ -10467,6 +10468,7 @@ merge(Compressor.prototype, {
                     argname = null;
                 } else if (compressor.has_directive("use strict")
                     || fn.name
+                    || fn.rest
                     || !(fn_parent instanceof AST_Call && index < fn_parent.args.length)
                     || !all(fn.argnames, function(argname) {
                         return argname instanceof AST_SymbolFunarg;
index 1a27860..f3c2af9 100644 (file)
@@ -485,3 +485,43 @@ keep_arguments: {
     expect_stdout: "PASS"
     node_version: ">=6"
 }
+
+issue_4525_1: {
+    options = {
+        arguments: true,
+    }
+    input: {
+        console.log(function(a, ...[]) {
+            a = "FAIL";
+            return arguments[0];
+        }("PASS"));
+    }
+    expect: {
+        console.log(function(a, ...[]) {
+            a = "FAIL";
+            return arguments[0];
+        }("PASS"));
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+issue_4525_2: {
+    options = {
+        unused: true,
+    }
+    input: {
+        console.log(function(a, ...[]) {
+            a = "FAIL";
+            return arguments[0];
+        }("PASS"));
+    }
+    expect: {
+        console.log(function(a, ...[]) {
+            a = "FAIL";
+            return arguments[0];
+        }("PASS"));
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}