fix return from recursive IIFE (#1570)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 7 Mar 2017 19:31:51 +0000 (03:31 +0800)
committerGitHub <noreply@github.com>
Tue, 7 Mar 2017 19:31:51 +0000 (03:31 +0800)
`side-effects` did not account for IIFEs being able to reference itself thus making its return value potentially significant

lib/compress.js
test/compress/issue-1569.js [new file with mode: 0644]

index 8bbbc3f..85b457e 100644 (file)
@@ -2100,7 +2100,8 @@ merge(Compressor.prototype, {
         def(AST_This, return_null);
         def(AST_Call, function(compressor, first_in_statement){
             if (!this.has_pure_annotation(compressor) && compressor.pure_funcs(this)) {
-                if (this.expression instanceof AST_Function) {
+                if (this.expression instanceof AST_Function
+                    && (!this.expression.name || !this.expression.name.definition().references.length)) {
                     var node = this.clone();
                     node.expression = node.expression.process_expression(false);
                     return node;
diff --git a/test/compress/issue-1569.js b/test/compress/issue-1569.js
new file mode 100644 (file)
index 0000000..5f0bca3
--- /dev/null
@@ -0,0 +1,19 @@
+inner_reference: {
+    options = {
+        side_effects: true,
+    }
+    input: {
+        !function f(a) {
+            return a && f(a - 1) + a;
+        }(42);
+        !function g(a) {
+            return a;
+        }(42);
+    }
+    expect: {
+        !function f(a) {
+            return a && f(a - 1) + a;
+        }(42);
+        !void 0;
+    }
+}