8143388: Compiler throws NullPointerException during compilation
authorjlahoda
Fri, 22 Jan 2016 21:00:26 +0100
changeset 35355 817b3a285dbb
parent 35354 a9c8e2634f92
child 35356 e919fd8db52c
8143388: Compiler throws NullPointerException during compilation Summary: Avoid putting "super" into a local variable while desugaring postfix operators. Reviewed-by: mcimadamore
langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
langtools/test/tools/javac/boxing/IncrementBoxedAndAccess.java
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Thu Jan 21 15:55:17 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Fri Jan 22 21:00:26 2016 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -2207,6 +2207,9 @@
             if ((id.sym.flags() & FINAL) != 0 && id.sym.owner.kind == MTH)
                 return builder.build(rval);
         }
+        Name name = TreeInfo.name(rval);
+        if (name == names._super)
+            return builder.build(rval);
         VarSymbol var =
             new VarSymbol(FINAL|SYNTHETIC,
                           names.fromString(
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/boxing/IncrementBoxedAndAccess.java	Fri Jan 22 21:00:26 2016 +0100
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8143388
+ * @summary Verify that boxed postfix operator works properly when referring to super class' field.
+ * @library /tools/lib
+ */
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class IncrementBoxedAndAccess {
+    public static void main(String... args) throws IOException {
+        new IncrementBoxedAndAccess().run();
+    }
+
+    void run() throws IOException {
+        ToolBox tb = new ToolBox();
+
+        Path expected = Paths.get("expected");
+        Files.createDirectories(expected);
+        tb.cleanDirectory(expected);
+        tb.new JavacTask()
+          .sources("package p1;" +
+                   "public class B {" +
+                   "    protected Integer i;" +
+                   "}",
+                   "package p2;" +
+                   "public class S extends p1.B {" +
+                   "    public void i() { i++; }" +
+                   "    private class I {" +
+                   "        void i() { i++; }" +
+                   "        private class II {" +
+                   "            void i() { i++; }" +
+                   "        }" +
+                   "    }" +
+                   "}")
+          .outdir(expected)
+          .run();
+
+        Path actual = Paths.get("actual");
+        Files.createDirectories(actual);
+        tb.cleanDirectory(actual);
+        tb.new JavacTask()
+          .sources("package p1;" +
+                   "public class B {" +
+                   "    protected Integer i;" +
+                   "}",
+                   "package p2;" +
+                   "public class S extends p1.B {" +
+                   "    public void i() { super.i++; }" +
+                   "    private class I {" +
+                   "        void i() { S.super.i++; }" +
+                   "        private class II {" +
+                   "            void i() { S.super.i++; }" +
+                   "        }" +
+                   "    }" +
+                   "}")
+          .outdir(actual)
+          .run();
+    }
+}