fix corner case in `collapse_vars` (#3954)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 5 Jun 2020 06:28:08 +0000 (07:28 +0100)
committerGitHub <noreply@github.com>
Fri, 5 Jun 2020 06:28:08 +0000 (14:28 +0800)
lib/compress.js
test/compress/collapse_vars.js

index 17b3ecf..23a9f92 100644 (file)
@@ -1832,13 +1832,13 @@ merge(Compressor.prototype, {
                         return make_node(AST_SymbolRef, expr.name, expr.name);
                     }
                 } else if (expr instanceof AST_Assign) {
-                    var lhs = expr.left;
-                    if (expr.operator == "=" && lhs instanceof AST_SymbolRef) {
-                        var def = lhs.definition();
-                        if (def.references[0] === lhs) {
-                            var referenced = def.references.length - def.replaced;
-                            if (referenced > 1) mangleable_var(expr.right);
-                        }
+                    var def, lhs = expr.left;
+                    if (expr.operator == "="
+                        && lhs instanceof AST_SymbolRef
+                        && (def = lhs.definition()).references[0] === lhs
+                        && !compressor.exposed(def)) {
+                        var referenced = def.references.length - def.replaced;
+                        if (referenced > 1) mangleable_var(expr.right);
                     }
                     return lhs;
                 } else {
index cea5ca8..0c232aa 100644 (file)
@@ -6888,6 +6888,30 @@ sequence_in_iife_2: {
     }
     expect: {
         var a = "foo", b = 42;
+        b = a;
+        console.log(a, b);
+    }
+    expect_stdout: "foo foo"
+}
+
+sequence_in_iife_3: {
+    options = {
+        collapse_vars: true,
+        inline: true,
+        passes: 2,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = "foo", b = 42;
+        (function() {
+            var c = (b = a, b);
+        })();
+        console.log(a, b);
+    }
+    expect: {
+        var a = "foo";
         console.log(a, a);
     }
     expect_stdout: "foo foo"