< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java

Print this page
rev 3787 : [mq]: 8147527

@@ -2216,11 +2216,11 @@
             JCIdent id = (JCIdent) rval;
             if ((id.sym.flags() & FINAL) != 0 && id.sym.owner.kind == MTH)
                 return builder.build(rval);
         }
         Name name = TreeInfo.name(rval);
-        if (name == names._super)
+        if (name == names._super || name == names._this)
             return builder.build(rval);
         VarSymbol var =
             new VarSymbol(FINAL|SYNTHETIC,
                           names.fromString(
                                           target.syntheticNameChar()

@@ -3203,11 +3203,15 @@
                         // in tree.type in Attr.
                         OperatorSymbol newOperator = operators.resolveBinary(tree,
                                                                       newTag,
                                                                       tree.type,
                                                                       tree.rhs.type);
-                        JCExpression expr = lhs;
+                        //Need to use the "lhs" at two places, once on the future left hand side
+                        //and once in the future binary operator. But further processing may change
+                        //the components of the tree in place (see visitSelect for e.g. <Class>.super.<ident>),
+                        //so cloning the tree to avoid interference between the uses:
+                        JCExpression expr = (JCExpression) lhs.clone();
                         if (expr.type != tree.type)
                             expr = make.TypeCast(tree.type, expr);
                         JCBinary opResult = make.Binary(newTag, expr, tree.rhs);
                         opResult.operator = newOperator;
                         opResult.type = newOperator.type.getReturnType();

@@ -3286,13 +3290,18 @@
                 public JCExpression build(final JCExpression tmp1) {
                     return abstractRval(tmp1, tree.arg.type, new TreeBuilder() {
                             public JCExpression build(final JCExpression tmp2) {
                                 JCTree.Tag opcode = (tree.hasTag(POSTINC))
                                     ? PLUS_ASG : MINUS_ASG;
-                                JCTree lhs = cast
-                                    ? make.TypeCast(tree.arg.type, tmp1)
-                                    : tmp1;
+                                //"tmp1" and "tmp2" may refer to the same instance
+                                //(for e.g. <Class>.super.<ident>). But further processing may
+                                //change the components of the tree in place (see visitSelect),
+                                //so cloning the tree to avoid interference between the two uses:
+                                JCExpression lhs = (JCExpression)tmp1.clone();
+                                lhs = cast
+                                    ? make.TypeCast(tree.arg.type, lhs)
+                                    : lhs;
                                 JCExpression update = makeAssignop(opcode,
                                                              lhs,
                                                              make.Literal(1));
                                 return makeComma(update, tmp2);
                             }
< prev index next >