7040104: javac NPE on Object a[]; Object o = (a=null)[0];

When a null literal is found on top of stack, if expected type is 1-dimension array no checkcast is emitted

Reviewed-by: jjg
This commit is contained in:
Maurizio Cimadamore 2011-04-29 16:05:02 +01:00
parent e29746adb0
commit f7618cbf97
2 changed files with 78 additions and 1 deletions
langtools
src/share/classes/com/sun/tools/javac/jvm
test/tools/javac

@ -479,7 +479,12 @@ public class Code {
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();

@ -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++;
}
}
}