detect boolean context across IIFEs (#3461)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 10 Oct 2019 01:37:02 +0000 (09:37 +0800)
committerGitHub <noreply@github.com>
Thu, 10 Oct 2019 01:37:02 +0000 (09:37 +0800)
lib/ast.js
test/compress/evaluate.js

index 6205cc7..5e1fbbb 100644 (file)
@@ -979,6 +979,14 @@ TreeWalker.prototype = {
                 || p instanceof AST_Conditional
                 || p.tail_node() === self) {
                 self = p;
+            } else if (p instanceof AST_Return) {
+                var fn;
+                do {
+                    fn = this.parent(++i);
+                    if (!fn) return false;
+                } while (!(fn instanceof AST_Lambda));
+                self = this.parent(++i);
+                if (!self || self.TYPE != "Call" || self.expression !== fn) return false;
             } else {
                 return false;
             }
index 0ac117f..22c87b7 100644 (file)
@@ -1757,3 +1757,34 @@ issue_3387_2: {
     }
     expect_stdout: "NaN"
 }
+
+iife_boolean_context: {
+    options = {
+        booleans: true,
+        evaluate: true,
+    }
+    input: {
+        console.log(function() {
+            return Object(1) || false;
+        }() ? "PASS" : "FAIL");
+        console.log(function() {
+            return [].length || true;
+        }() ? "PASS" : "FAIL");
+    }
+    expect: {
+        console.log(function() {
+            return Object(1);
+        }() ? "PASS" : "FAIL");
+        console.log(function() {
+            return [].length, 1;
+        }() ? "PASS" : "FAIL");
+    }
+    expect_stdout: [
+        "PASS",
+        "PASS",
+    ]
+    expect_warnings: [
+        "WARN: Dropping side-effect-free || [test/compress/evaluate.js:2,19]",
+        "WARN: Boolean || always true [test/compress/evaluate.js:5,19]",
+    ]
+}