diff --git a/lib/compress.js b/lib/compress.js index f4aa62d44a..39392c9737 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1884,9 +1884,17 @@ merge(Compressor.prototype, { && node.name == def.name) { if (!--replaced) abort = true; if (is_lhs(node, multi_replacer.parent())) return node; - def.replaced++; var ref = rvalue.clone(); value_def.references.push(ref); + if (abort && candidate instanceof AST_Assign + && def.references.length - def.replaced - (assignments[def.name] || 0) > 1) { + return make_node(AST_Assign, candidate, { + operator: "=", + left: node, + right: ref, + }); + } + def.replaced++; return ref; } // Skip (non-executed) functions and (leading) default case in switch statements diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 449ce3d5f2..3ac8894afa 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -9057,3 +9057,31 @@ issue_4874: { } expect_stdout: "PASS" } + +issue_4891: { + options = { + collapse_vars: true, + reduce_vars: true, + toplevel: true, + } + input: { + var a = 0, b; + a++; + console.log(b = a, b); + b--; + a.a += 0; + console.log(b); + } + expect: { + var a = 0, b; + a++; + console.log(a, b = a); + b--; + a.a += 0; + console.log(b); + } + expect_stdout: [ + "1 1", + "0", + ] +}