fix corner case in `rename` (#4000)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 14 Jun 2020 17:29:01 +0000 (01:29 +0800)
committerGitHub <noreply@github.com>
Sun, 14 Jun 2020 17:29:01 +0000 (01:29 +0800)
fixes #3999

lib/scope.js
test/compress/ie8.js

index 2f49df7..6631476 100644 (file)
@@ -543,11 +543,8 @@ AST_Toplevel.DEFMETHOD("expand_names", function(options) {
         var redef = def.redefined();
         var name = redef ? redef.rename || redef.name : next_name();
         def.rename = name;
-        def.orig.forEach(function(sym) {
-            sym.name = name;
-        });
-        def.references.forEach(function(sym) {
-            sym.name = name;
+        def.orig.concat(def.references).forEach(function(sym) {
+            if (sym.definition() === def) sym.name = name;
         });
     }
 });
index e11e365..c004976 100644 (file)
@@ -2223,13 +2223,13 @@ issue_3523_rename_ie8: {
     expect: {
         var a = 0, b, c = "FAIL";
         (function() {
-            var c, n, t, o, a, r, f, i, u, e, h, l, v, y;
+            var c, n, t, o, a, r, e, f, i, u, h, l, v, y;
         })();
         try {
             throw 0;
         } catch (e) {
             (function() {
-                (function n() {
+                (function e() {
                     c = "PASS";
                 })();
             })();
@@ -2522,3 +2522,40 @@ issue_3918: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3999: {
+    rename = true
+    mangle = {
+        ie8: true,
+    }
+    input: {
+        (function() {
+            (function f() {
+                for (var i = 0; i < 2; i++)
+                    try {
+                        f[0];
+                    } catch (f) {
+                        var f = 0;
+                        console.log(i);
+                    }
+            })();
+        })(typeof f);
+    }
+    expect: {
+        (function() {
+            (function f() {
+                for (var c = 0; c < 2; c++)
+                    try {
+                        f[0];
+                    } catch (f) {
+                        var f = 0;
+                        console.log(c);
+                    }
+            })();
+        })(typeof f);
+    }
+    expect_stdout: [
+        "0",
+        "1",
+    ]
+}