fix corner case in `functions` & `unused` (#3803)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 18 Apr 2020 22:28:01 +0000 (23:28 +0100)
committerGitHub <noreply@github.com>
Sat, 18 Apr 2020 22:28:01 +0000 (06:28 +0800)
fixes #3802

lib/compress.js
test/compress/drop-unused.js

index b0e25dd..6742aef 100644 (file)
@@ -4151,22 +4151,17 @@ merge(Compressor.prototype, {
                             def.value = def.value.drop_side_effect_free(compressor);
                         }
                         var var_defs = var_defs_by_id.get(sym.id);
-                        if (var_defs.length > 1) {
-                            if (!def.value) {
+                        if (!def.value) {
+                            if (var_defs.length > 1) {
                                 AST_Node.warn("Dropping duplicated declaration of variable {name} [{file}:{line},{col}]", template(def.name));
                                 remove(var_defs, def);
                                 sym.eliminated++;
-                                return;
-                            }
-                            if (sym.orig.indexOf(def.name) > sym.eliminated) {
-                                remove(var_defs, def);
-                                duplicated++;
+                            } else {
+                                head.push(def);
                             }
-                        }
-                        if (!def.value) {
-                            head.push(def);
                         } else if (compressor.option("functions")
                             && !compressor.option("ie8")
+                            && var_defs.length == 1
                             && def.value === def.name.fixed_value()
                             && def.value instanceof AST_Function
                             && !(def.value.name && def.value.name.definition().assignments)
@@ -4188,6 +4183,10 @@ merge(Compressor.prototype, {
                             }
                             body.push(defun);
                         } else {
+                            if (var_defs.length > 1 && sym.orig.indexOf(def.name) > sym.eliminated) {
+                                remove(var_defs, def);
+                                duplicated++;
+                            }
                             if (side_effects.length > 0) {
                                 if (tail.length > 0) {
                                     side_effects.push(def.value);
index 3a61f24..a39dd48 100644 (file)
@@ -2488,3 +2488,25 @@ drop_duplicated_var_catch: {
         }
     }
 }
+
+issue_3802: {
+    options = {
+        functions: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = 0;
+        a += 0;
+        var a = function() {};
+        console.log(typeof a);
+    }
+    expect: {
+        var a = 0;
+        a += 0;
+        a = function() {};
+        console.log(typeof a);
+    }
+    expect_stdout: "function"
+}