diff --git a/lib/compress.js b/lib/compress.js index 2dc6fabb5d..ac66ce6ac1 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -6279,11 +6279,15 @@ merge(Compressor.prototype, { function can_rename(fn, name) { if (!fn.name) return !fn.variables.get(name); old_def = fn.name.definition(); - if (old_def.assignments > 0) return false; - if (old_def.name == name) return true; + if (old_def.orig.length > 1) { + old_def = null; + } else { + if (old_def.assignments > 0) return false; + if (old_def.name == name) return true; + } if (name == "await" && is_async(fn)) return false; if (name == "yield" && is_generator(fn)) return false; - return all(old_def.references, function(ref) { + return !old_def || all(old_def.references, function(ref) { return ref.scope.find_variable(name) === sym; }); } diff --git a/test/compress/functions.js b/test/compress/functions.js index 68ff709b26..e43efceab7 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -5912,3 +5912,40 @@ issue_4753_2: { } expect_stdout: "PASS" } + +issue_4788: { + options = { + evaluate: true, + functions: true, + keep_fnames: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function f() { + var a = function g() { + if (0) { + var g = 42; + f(); + } + g || console.log("PASS"); + }; + a(a); + } + f(); + } + expect: { + (function f() { + function a() { + if (0) { + var g = 42; + f(); + } + g || console.log("PASS"); + } + a(); + })(); + } + expect_stdout: "PASS" +} diff --git a/test/compress/hoist_vars.js b/test/compress/hoist_vars.js index 305f98c64e..4118f7650c 100644 --- a/test/compress/hoist_vars.js +++ b/test/compress/hoist_vars.js @@ -153,7 +153,7 @@ issue_4487: { } expect: { function a() { - var a = console.log(typeof a); + var f = console.log(typeof f); } a(); } diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js index bc9e62a071..f7ad29adbc 100644 --- a/test/ufuzz/index.js +++ b/test/ufuzz/index.js @@ -1947,7 +1947,11 @@ function createTypeofExpr(recurmax, stmtDepth, canThrow) { } function createValue() { - return VALUES[rng(VALUES.length)]; + var v; + do { + v = VALUES[rng(VALUES.length)]; + } while (v == "new.target" && rng(200)); + return v; } function createBinaryOp(noComma, canThrow) {