Fri, 10 Dec 2010 15:23:42 +0000
7005671: Regression: compiler accepts invalid cast from X[] to primitive array
Summary: regression in type conversion after 292 changes
Reviewed-by: jjg
1.1 --- a/src/share/classes/com/sun/tools/javac/code/Types.java Thu Dec 09 19:53:03 2010 -0800 1.2 +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Fri Dec 10 15:23:42 2010 +0000 1.3 @@ -1080,7 +1080,8 @@ 1.4 case CLASS: 1.5 return isSubtype(t, s); 1.6 case ARRAY: 1.7 - if (elemtype(t).tag <= lastBaseTag) { 1.8 + if (elemtype(t).tag <= lastBaseTag || 1.9 + elemtype(s).tag <= lastBaseTag) { 1.10 return elemtype(t).tag == elemtype(s).tag; 1.11 } else { 1.12 return visit(elemtype(t), elemtype(s));
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/javac/cast/7005671/T7005671.java Fri Dec 10 15:23:42 2010 +0000 2.3 @@ -0,0 +1,32 @@ 2.4 +/* 2.5 + * @test /nodynamiccopyright/ 2.6 + * @author mcimadamore 2.7 + * @bug 7005671 2.8 + * @summary Regression: compiler accepts invalid cast from X[] to primitive array 2.9 + * @compile/fail/ref=T7005671.out -XDrawDiagnostics T7005671.java 2.10 + */ 2.11 + 2.12 +class T7005671<X> { 2.13 + 2.14 + void test1() { 2.15 + Object o1 = (X[])(byte[])null; 2.16 + Object o2 = (X[])(short[])null; 2.17 + Object o3 = (X[])(int[])null; 2.18 + Object o4 = (X[])(long[])null; 2.19 + Object o5 = (X[])(float[])null; 2.20 + Object o6 = (X[])(double[])null; 2.21 + Object o7 = (X[])(char[])null; 2.22 + Object o8 = (X[])(boolean[])null; 2.23 + } 2.24 + 2.25 + void test2() { 2.26 + Object o1 = (byte[])(X[])null; 2.27 + Object o2 = (short[])(X[])null; 2.28 + Object o3 = (int[])(X[])null; 2.29 + Object o4 = (long[])(X[])null; 2.30 + Object o5 = (float[])(X[])null; 2.31 + Object o6 = (double[])(X[])null; 2.32 + Object o7 = (char[])(X[])null; 2.33 + Object o8 = (boolean[])(X[])null; 2.34 + } 2.35 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/javac/cast/7005671/T7005671.out Fri Dec 10 15:23:42 2010 +0000 3.3 @@ -0,0 +1,17 @@ 3.4 +T7005671.java:12:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), byte[], X[] 3.5 +T7005671.java:13:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), short[], X[] 3.6 +T7005671.java:14:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), int[], X[] 3.7 +T7005671.java:15:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), long[], X[] 3.8 +T7005671.java:16:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), float[], X[] 3.9 +T7005671.java:17:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), double[], X[] 3.10 +T7005671.java:18:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), char[], X[] 3.11 +T7005671.java:19:26: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), boolean[], X[] 3.12 +T7005671.java:23:29: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], byte[] 3.13 +T7005671.java:24:30: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], short[] 3.14 +T7005671.java:25:28: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], int[] 3.15 +T7005671.java:26:29: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], long[] 3.16 +T7005671.java:27:30: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], float[] 3.17 +T7005671.java:28:31: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], double[] 3.18 +T7005671.java:29:29: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], char[] 3.19 +T7005671.java:30:32: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), X[], boolean[] 3.20 +16 errors