fix corner case in `booleans` (#4246)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 26 Oct 2020 10:53:58 +0000 (10:53 +0000)
committerGitHub <noreply@github.com>
Mon, 26 Oct 2020 10:53:58 +0000 (18:53 +0800)
fixes #4245

lib/compress.js
test/compress.js
test/compress/const.js
test/compress/let.js

index 647c97e..d8f689c 100644 (file)
@@ -7598,7 +7598,9 @@ merge(Compressor.prototype, {
                 // typeof always returns a non-empty string, thus it's
                 // always true in booleans
                 AST_Node.warn("Boolean expression always true [{file}:{line},{col}]", self.start);
-                return (exp instanceof AST_SymbolRef ? make_node(AST_True, self) : make_sequence(self, [
+                return (exp instanceof AST_SymbolRef && all(exp.definition().orig, function(sym) {
+                    return !(sym instanceof AST_SymbolConst || sym instanceof AST_SymbolLet);
+                }) ? make_node(AST_True, self) : make_sequence(self, [
                     exp,
                     make_node(AST_True, self)
                 ])).optimize(compressor);
index 77b09f0..3d9b1a6 100644 (file)
@@ -386,7 +386,7 @@ function test_case(test) {
             mangle: test.mangle
         });
         var actual = stdout[toplevel ? 1 : 0];
-        if (test.expect_stdout === true) {
+        if (test.expect_stdout === true || test.expect_stdout instanceof Error && test.expect_stdout.name === actual.name) {
             test.expect_stdout = actual;
         }
         if (!sandbox.same_stdout(test.expect_stdout, actual)) {
index 694c9d1..2f88975 100644 (file)
@@ -1084,3 +1084,23 @@ issue_4231: {
     }
     expect_stdout: "function"
 }
+
+issue_4245: {
+    options = {
+        booleans: true,
+    }
+    input: {
+        const a = f();
+        function f() {
+            typeof a;
+        }
+    }
+    expect: {
+        const a = f();
+        function f() {
+            a,
+            1;
+        }
+    }
+    expect_stdout: true
+}
index 8374db9..deb4812 100644 (file)
@@ -893,3 +893,26 @@ issue_4231: {
     expect_stdout: "function"
     node_version: ">=4"
 }
+
+issue_4245: {
+    options = {
+        booleans: true,
+    }
+    input: {
+        "use strict";
+        let a = f();
+        function f() {
+            typeof a;
+        }
+    }
+    expect: {
+        "use strict";
+        let a = f();
+        function f() {
+            a,
+            1;
+        }
+    }
+    expect_stdout: ReferenceError("a is not defined")
+    node_version: ">=4"
+}