8026374: javac accepts void as a method parameter
authorjlahoda
Tue, 26 Nov 2013 15:27:19 +0100
changeset 21896 f39003ba351f
parent 21895 2afdc45dcc5b
child 21897 ba025087b9f9
8026374: javac accepts void as a method parameter Summary: Changing Check.validate to reject void types. Reviewed-by: jjg, vromero
langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
langtools/test/tools/javac/declaration/method/MethodVoidParameter.java
langtools/test/tools/javac/declaration/method/MethodVoidParameter.out
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Tue Nov 26 13:33:33 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Tue Nov 26 15:27:19 2013 +0100
@@ -933,7 +933,8 @@
             chk.validate(tree.typarams, localEnv);
 
             // Check that result type is well-formed.
-            chk.validate(tree.restype, localEnv);
+            if (tree.restype != null && !tree.restype.type.hasTag(VOID))
+                chk.validate(tree.restype, localEnv);
 
             // Check that receiver type is well-formed.
             if (tree.recvparam != null) {
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Tue Nov 26 13:33:33 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Tue Nov 26 15:27:19 2013 +0100
@@ -1326,6 +1326,14 @@
             tree.underlyingType.accept(this);
         }
 
+        @Override
+        public void visitTypeIdent(JCPrimitiveTypeTree that) {
+            if (that.type.hasTag(TypeTag.VOID)) {
+                log.error(that.pos(), "void.not.allowed.here");
+            }
+            super.visitTypeIdent(that);
+        }
+
         /** Default visitor method: do nothing.
          */
         @Override
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/declaration/method/MethodVoidParameter.java	Tue Nov 26 15:27:19 2013 +0100
@@ -0,0 +1,9 @@
+/* @test /nodynamiccopyright/
+ * @bug 8026374
+ * @summary Cannot use void as a variable type
+ * @compile/fail/ref=MethodVoidParameter.out -XDrawDiagnostics MethodVoidParameter.java
+ */
+public class MethodVoidParameter {
+    void method(void v) { }
+    void method(void... v) { }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/declaration/method/MethodVoidParameter.out	Tue Nov 26 15:27:19 2013 +0100
@@ -0,0 +1,3 @@
+MethodVoidParameter.java:7:17: compiler.err.void.not.allowed.here
+MethodVoidParameter.java:8:17: compiler.err.void.not.allowed.here
+2 errors