Fix (typeof side_effect()) in boolean context
authorkzc <zaxxon2011@gmail.com>
Sun, 2 Oct 2016 14:46:09 +0000 (10:46 -0400)
committerRichard van Velzen <rvanvelzen@experty.com>
Thu, 6 Oct 2016 11:50:11 +0000 (13:50 +0200)
Fixes #1289 with suggestion by @rvanvelzen

lib/compress.js
test/compress/typeof.js

index 14fb8f1..1845717 100644 (file)
@@ -2314,6 +2314,12 @@ merge(Compressor.prototype, {
                 // typeof always returns a non-empty string, thus it's
                 // always true in booleans
                 compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start);
+                if (self.expression.has_side_effects(compressor)) {
+                    return make_node(AST_Seq, self, {
+                        car: self.expression,
+                        cdr: make_node(AST_True, self)
+                    });
+                }
                 return make_node(AST_True, self);
             }
             if (e instanceof AST_Binary && self.operator == "!") {
index cefdd43..fb39157 100644 (file)
@@ -23,3 +23,25 @@ typeof_evaluation: {
         h='undefined';
     }
 }
+
+typeof_in_boolean_context: {
+    options = {
+        booleans     : true,
+        evaluate     : true,
+        conditionals : true,
+    };
+    input: {
+        function f1(x) { return typeof x ? "yes" : "no"; }
+        function f2() { return typeof g()? "Yes" : "No"; }
+        typeof 0 ? foo() : bar();
+        !typeof console.log(1);
+        var a = !typeof console.log(2);
+    }
+    expect: {
+        function f1(x) { return "yes"; }
+        function f2() { return g(), "Yes"; }
+        foo();
+        !(console.log(1), !0);
+        var a = !(console.log(2), !0);
+    }
+}