Mercurial > hg > release > icedtea7-forest-2.1 > langtools
changeset 1086:8c9f07f9aa28
7057297: Project Coin: diamond erroneously accepts in array initializer expressions
Summary: Diamond in array initializer expressions should be rejected
Reviewed-by: jjg, dlsmith
author | mcimadamore |
---|---|
date | Wed, 27 Jul 2011 19:01:33 +0100 |
parents | 2de6d1e52742 |
children | 9566fd61b11c 2f776c884f48 20f538c8b111 |
files | src/share/classes/com/sun/tools/javac/parser/JavacParser.java src/share/classes/com/sun/tools/javac/resources/compiler.properties test/tools/javac/diags/examples/CannotCreateArrayWithDiamond.java test/tools/javac/generics/diamond/7057297/T7057297.java test/tools/javac/generics/diamond/7057297/T7057297.out |
diffstat | 5 files changed, 81 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Wed Jul 27 19:01:08 2011 +0100 +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Wed Jul 27 19:01:33 2011 +0100 @@ -1381,8 +1381,10 @@ int oldmode = mode; mode = TYPE; boolean diamondFound = false; + int lastTypeargsPos = -1; if (S.token() == LT) { checkGenerics(); + lastTypeargsPos = S.pos(); t = typeArguments(t, true); diamondFound = (mode & DIAMOND) != 0; } @@ -1395,6 +1397,7 @@ S.nextToken(); t = toP(F.at(pos).Select(t, ident())); if (S.token() == LT) { + lastTypeargsPos = S.pos(); checkGenerics(); t = typeArguments(t, true); diamondFound = (mode & DIAMOND) != 0; @@ -1403,7 +1406,11 @@ mode = oldmode; if (S.token() == LBRACKET) { JCExpression e = arrayCreatorRest(newpos, t); - if (typeArgs != null) { + if (diamondFound) { + reportSyntaxError(lastTypeargsPos, "cannot.create.array.with.diamond"); + return toP(F.at(newpos).Erroneous(List.of(e))); + } + else if (typeArgs != null) { int pos = newpos; if (!typeArgs.isEmpty() && typeArgs.head.pos != Position.NOPOS) { // note: this should always happen but we should
--- a/src/share/classes/com/sun/tools/javac/resources/compiler.properties Wed Jul 27 19:01:08 2011 +0100 +++ b/src/share/classes/com/sun/tools/javac/resources/compiler.properties Wed Jul 27 19:01:33 2011 +0100 @@ -462,6 +462,9 @@ compiler.err.cannot.create.array.with.type.arguments=\ cannot create array with type arguments +compiler.err.cannot.create.array.with.diamond=\ + cannot create array with ''<>'' + # # limits. We don't give the limits in the diagnostic because we expect # them to change, yet we want to use the same diagnostic. These are all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/diags/examples/CannotCreateArrayWithDiamond.java Wed Jul 27 19:01:33 2011 +0100 @@ -0,0 +1,28 @@ +/* + * 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. + */ + +// key: compiler.err.cannot.create.array.with.diamond + +class CannotCreateArrayWithDiamond { + Object[] array = new Object<>[3]; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/diamond/7057297/T7057297.java Wed Jul 27 19:01:33 2011 +0100 @@ -0,0 +1,29 @@ +/* + * @test /nodynamiccopyright/ + * @bug 7057297 + * + * @summary Project Coin: diamond erroneously accepts in array initializer expressions + * @compile/fail/ref=T7057297.out T7057297.java -XDrawDiagnostics + * + */ + +class T7205797<X> { + + class Inner<Y> {} + + T7205797<String>[] o1 = new T7205797<>[1]; //error + T7205797<String>[] o2 = new T7205797<>[1][1]; //error + T7205797<String>[] o3 = new T7205797<>[1][1][1]; //error + + T7205797<String>[] o4 = new T7205797<>[] { }; //error + T7205797<String>[] o5 = new T7205797<>[][] { }; //error + T7205797<String>[] o6 = new T7205797<>[][][] { }; //error + + T7205797<String>.Inner<String>[] o1 = new T7205797<String>.Inner<>[1]; //error + T7205797<String>.Inner<String>[] o2 = new T7205797<String>.Inner<>[1][1]; //error + T7205797<String>.Inner<String>[] o3 = new T7205797<String>.Inner<>[1][1][1]; //error + + T7205797<String>.Inner<String>[] o4 = new T7205797<String>.Inner<>[] { }; //error + T7205797<String>.Inner<String>[] o5 = new T7205797<String>.Inner<>[][] { }; //error + T7205797<String>.Inner<String>[] o6 = new T7205797<String>.Inner<>[][][] { }; //error +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/diamond/7057297/T7057297.out Wed Jul 27 19:01:33 2011 +0100 @@ -0,0 +1,13 @@ +T7057297.java:14:41: compiler.err.cannot.create.array.with.diamond +T7057297.java:15:41: compiler.err.cannot.create.array.with.diamond +T7057297.java:16:41: compiler.err.cannot.create.array.with.diamond +T7057297.java:18:41: compiler.err.cannot.create.array.with.diamond +T7057297.java:19:41: compiler.err.cannot.create.array.with.diamond +T7057297.java:20:41: compiler.err.cannot.create.array.with.diamond +T7057297.java:22:69: compiler.err.cannot.create.array.with.diamond +T7057297.java:23:69: compiler.err.cannot.create.array.with.diamond +T7057297.java:24:69: compiler.err.cannot.create.array.with.diamond +T7057297.java:26:69: compiler.err.cannot.create.array.with.diamond +T7057297.java:27:69: compiler.err.cannot.create.array.with.diamond +T7057297.java:28:69: compiler.err.cannot.create.array.with.diamond +12 errors