aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js6
-rw-r--r--test/compress/typeof.js22
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 14fb8f1e..1845717c 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -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 == "!") {
diff --git a/test/compress/typeof.js b/test/compress/typeof.js
index cefdd43c..fb391573 100644
--- a/test/compress/typeof.js
+++ b/test/compress/typeof.js
@@ -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);
+ }
+}