langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
changeset 40306 1a0fcaf3f2ed
parent 40236 48d9e26a8fa4
child 42407 f3702cff2933
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Wed Aug 10 10:47:43 2016 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Wed Aug 10 13:52:02 2016 -0700
@@ -3184,11 +3184,13 @@
     }
 
     public void visitAssignop(final JCAssignOp tree) {
-        JCTree lhsAccess = access(TreeInfo.skipParens(tree.lhs));
         final boolean boxingReq = !tree.lhs.type.isPrimitive() &&
             tree.operator.type.getReturnType().isPrimitive();
 
-        if (boxingReq || lhsAccess.hasTag(APPLY)) {
+        AssignopDependencyScanner depScanner = new AssignopDependencyScanner(tree);
+        depScanner.scan(tree.rhs);
+
+        if (boxingReq || depScanner.dependencyFound) {
             // boxing required; need to rewrite as x = (unbox typeof x)(x op y);
             // or if x == (typeof x)z then z = (unbox typeof x)((typeof x)z op y)
             // (but without recomputing x)
@@ -3238,6 +3240,41 @@
         }
     }
 
+    class AssignopDependencyScanner extends TreeScanner {
+
+        Symbol sym;
+        boolean dependencyFound = false;
+
+        AssignopDependencyScanner(JCAssignOp tree) {
+            this.sym = TreeInfo.symbol(tree.lhs);
+        }
+
+        @Override
+        public void scan(JCTree tree) {
+            if (tree != null && sym != null) {
+                tree.accept(this);
+            }
+        }
+
+        @Override
+        public void visitAssignop(JCAssignOp tree) {
+            if (TreeInfo.symbol(tree.lhs) == sym) {
+                dependencyFound = true;
+                return;
+            }
+            super.visitAssignop(tree);
+        }
+
+        @Override
+        public void visitUnary(JCUnary tree) {
+            if (TreeInfo.symbol(tree.arg) == sym) {
+                dependencyFound = true;
+                return;
+            }
+            super.visitUnary(tree);
+        }
+    }
+
     /** Lower a tree of the form e++ or e-- where e is an object type */
     JCExpression lowerBoxedPostop(final JCUnary tree) {
         // translate to tmp1=lval(e); tmp2=tmp1; tmp1 OP 1; tmp2