6569633: Varargs: parser error when varargs element type is an array
Summary: explicit error message when old-style array syntax is mixed with varargs
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Mon Jan 24 15:45:06 2011 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Mon Jan 24 15:45:24 2011 +0000
@@ -2168,8 +2168,11 @@
JCVariableDecl variableDeclaratorId(JCModifiers mods, JCExpression type) {
int pos = S.pos();
Name name = ident();
- if ((mods.flags & Flags.VARARGS) == 0)
- type = bracketsOpt(type);
+ if ((mods.flags & Flags.VARARGS) != 0 &&
+ S.token() == LBRACKET) {
+ log.error(S.pos(), "varargs.and.old.array.syntax");
+ }
+ type = bracketsOpt(type);
return toP(F.at(pos).VarDef(mods, name, type, null));
}
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Mon Jan 24 15:45:06 2011 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Mon Jan 24 15:45:24 2011 +0000
@@ -266,6 +266,8 @@
hexadecimal numbers must contain at least one hexadecimal digit
compiler.err.invalid.meth.decl.ret.type.req=\
invalid method declaration; return type required
+compiler.err.varargs.and.old.array.syntax=\
+ legacy array notation not allowed on variable-arity parameter
compiler.err.label.already.in.use=\
label {0} already in use
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/VarargsAndOldArraySyntax.java Mon Jan 24 15:45:24 2011 +0000
@@ -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.varargs.and.old.array.syntax
+
+class VarargsAndOldArraySyntax {
+ void m1 (Integer... i[]) { }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/varargs/6569633/T6569633.java Mon Jan 24 15:45:24 2011 +0000
@@ -0,0 +1,13 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6569633
+ * @author mcimadamore
+ * @summary Varargs: parser error when varargs element type is an array
+ * @compile/fail/ref=T6569633.out -XDrawDiagnostics T6569633.java
+ */
+
+class T6569633 {
+ void m1 (Integer... i[]) { }
+ void m2 (Integer[]... i) { }
+ void m3 (Integer[]... i[]) { }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/varargs/6569633/T6569633.out Mon Jan 24 15:45:24 2011 +0000
@@ -0,0 +1,3 @@
+T6569633.java:10:27: compiler.err.varargs.and.old.array.syntax
+T6569633.java:12:29: compiler.err.varargs.and.old.array.syntax
+2 errors