7040104: javac NPE on Object a[]; Object o = (a=null)[0];
Summary: When a null literal is found on top of stack, if expected type is 1-dimension array no checkcast is emitted
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu Apr 28 15:05:36 2011 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Fri Apr 29 16:05:02 2011 +0100
@@ -479,7 +479,12 @@
state.pop(1);// index
Type a = state.stack[state.stacksize-1];
state.pop(1);
- state.push(types.erasure(types.elemtype(a))); }
+ //sometimes 'null type' is treated as a one-dimensional array type
+ //see Gen.visitLiteral - we should handle this case accordingly
+ Type stackType = a.tag == BOT ?
+ syms.objectType :
+ types.erasure(types.elemtype(a));
+ state.push(stackType); }
break;
case goto_:
markDead();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T7040104.java Fri Apr 29 16:05:02 2011 +0100
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2011, 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 7040104
+ * @summary javac NPE on Object a[]; Object o = (a=null)[0];
+ */
+
+public class T7040104 {
+ public static void main(String[] args) {
+ T7040104 t = new T7040104();
+ t.test1();
+ t.test2();
+ t.test3();
+ if (t.npeCount != 3) {
+ throw new AssertionError();
+ }
+ }
+
+ int npeCount = 0;
+
+ void test1() {
+ Object a[];
+ try {
+ Object o = (a = null)[0];
+ }
+ catch (NullPointerException npe) {
+ npeCount++;
+ }
+ }
+
+ void test2() {
+ Object a[][];
+ try {
+ Object o = (a = null)[0][0];
+ }
+ catch (NullPointerException npe) {
+ npeCount++;
+ }
+ }
+
+ void test3() {
+ Object a[][][];
+ try {
+ Object o = (a = null)[0][0][0];
+ }
+ catch (NullPointerException npe) {
+ npeCount++;
+ }
+ }
+}