diff --git a/lib/compress.js b/lib/compress.js index e8a4815e..a9671257 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -606,7 +606,11 @@ merge(Compressor.prototype, { var safe = tw.safe_ids[def.id]; if (!HOP(tw.safe_ids, def.id)) { if (!safe) return false; - if (safe.read && def.scope.resolve() !== tw.find_parent(AST_Scope)) return false; + if (safe.read) { + var scope = tw.find_parent(AST_BlockScope); + if (scope instanceof AST_Class) return false; + if (def.scope.resolve() !== scope.resolve()) return false; + } safe.assign = safe.assign && safe.assign !== tw.safe_ids ? true : tw.safe_ids; } if (def.fixed != null && safe.read) { diff --git a/test/compress/classes.js b/test/compress/classes.js index f9797022..4671fd07 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -1748,3 +1748,47 @@ issue_4992: { expect_stdout: "function" node_version: ">=12" } + +issue_4996_1: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + } + input: { + var a = 1; + console.log(new class A { + p = a-- && new A(); + }().p.p); + } + expect: { + var a = 1; + console.log(new class A { + p = a-- && new A(); + }().p.p); + } + expect_stdout: "0" + node_version: ">=12" +} + +issue_4996_2: { + options = { + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a = 1; + console.log(new class A { + p = a-- && new A(); + }().p.p); + } + expect: { + var a = 1; + console.log(new class A { + p = a-- && new A(); + }().p.p); + } + expect_stdout: "0" + node_version: ">=12" +}