fix corner case in `dead_code` (#3553)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 30 Oct 2019 06:21:22 +0000 (14:21 +0800)
committerGitHub <noreply@github.com>
Wed, 30 Oct 2019 06:21:22 +0000 (14:21 +0800)
fixes #3552

lib/compress.js
test/compress/dead-code.js

index 33943ff..a28c7a6 100644 (file)
@@ -6433,15 +6433,17 @@ merge(Compressor.prototype, {
     OPT(AST_Assign, function(self, compressor) {
         if (compressor.option("dead_code")) {
             if (self.left instanceof AST_PropAccess) {
-                var exp = self.left.expression;
-                if (exp instanceof AST_Lambda
-                    || !compressor.has_directive("use strict")
-                        && exp instanceof AST_Constant
-                        && !exp.may_throw_on_access(compressor)) {
-                    return self.left instanceof AST_Dot ? self.right : make_sequence(self, [
-                        self.left.property,
-                        self.right
-                    ]).optimize(compressor);
+                if (self.operator == "=") {
+                    var exp = self.left.expression;
+                    if (exp instanceof AST_Lambda
+                        || !compressor.has_directive("use strict")
+                            && exp instanceof AST_Constant
+                            && !exp.may_throw_on_access(compressor)) {
+                        return self.left instanceof AST_Dot ? self.right : make_sequence(self, [
+                            self.left.property,
+                            self.right
+                        ]).optimize(compressor);
+                    }
                 }
             } else if (self.left instanceof AST_SymbolRef) {
                 var def = self.left.definition();
index 501d55e..93fc9f4 100644 (file)
@@ -1042,3 +1042,25 @@ function_assign: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3552: {
+    options = {
+        dead_code: true,
+        pure_getters: "strict",
+    }
+    input: {
+        var a = "PASS";
+        (function() {
+            (1..p += 42) && (a = "FAIL");
+        })();
+        console.log(a);
+    }
+    expect: {
+        var a = "PASS";
+        (function() {
+            (1..p += 42) && (a = "FAIL");
+        })();
+        console.log(a);
+    }
+    expect_stdout: "PASS"
+}