fix corner case in `side_effects` (#3514)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 22 Oct 2019 17:04:00 +0000 (01:04 +0800)
committerGitHub <noreply@github.com>
Tue, 22 Oct 2019 17:04:00 +0000 (01:04 +0800)
fixes #3512

lib/compress.js
test/compress/functions.js

index 2b61e91..a8bf0d9 100644 (file)
@@ -4196,7 +4196,7 @@ merge(Compressor.prototype, {
             var left = this.left;
             if (left instanceof AST_PropAccess) {
                 var expr = left.expression;
-                if (expr instanceof AST_Assign && !expr.may_throw_on_access(compressor)) {
+                if (expr instanceof AST_Assign && expr.operator == "=" && !expr.may_throw_on_access(compressor)) {
                     expr.write_only = "p";
                 }
                 if (compressor.has_directive("use strict") && expr.is_constant()) return this;
index 5c8533d..0607e85 100644 (file)
@@ -3340,3 +3340,33 @@ issue_3506_3: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3512: {
+    options = {
+        collapse_vars: true,
+        pure_getters: "strict",
+        sequences: true,
+        side_effects: true,
+        unused: true,
+    }
+    input: {
+        var a = "PASS";
+        (function(b) {
+            (function() {
+                b <<= this || 1;
+                b.a = "FAIL";
+            })();
+        })();
+        console.log(a);
+    }
+    expect: {
+        var a = "PASS";
+        (function(b) {
+            (function() {
+                (b <<= this || 1).a = "FAIL";
+            })();
+        })(),
+        console.log(a);
+    }
+    expect_stdout: "PASS"
+}