8210742: compound var declaration type is not uniform for all variables
authorsdama
Tue, 20 Nov 2018 21:59:07 +0530
changeset 52622 7a8af2f1f0c5
parent 52621 f7309a1491d9
child 52623 ba5c08883729
8210742: compound var declaration type is not uniform for all variables Summary: make implicit type for all variables in compound declaration as null for which type inference happens at later phase Reviewed-by: mcimadamore Contributed-by: srinivas.dama@oracle.com
src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
test/langtools/tools/javac/parser/JavacParserTest.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java	Tue Nov 20 13:12:48 2018 +0000
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java	Tue Nov 20 21:59:07 2018 +0530
@@ -3180,13 +3180,13 @@
         if (elemType.hasTag(IDENT)) {
             Name typeName = ((JCIdent)elemType).name;
             if (isRestrictedLocalVarTypeName(typeName, pos, !compound && localDecl)) {
-                if (compound) {
-                    //error - 'var' in compound local var decl
-                   reportSyntaxError(pos, Errors.VarNotAllowedCompound);
-                } else if (type.hasTag(TYPEARRAY)) {
+                if (type.hasTag(TYPEARRAY) && !compound) {
                     //error - 'var' and arrays
                     reportSyntaxError(pos, Errors.VarNotAllowedArray);
                 } else {
+                    if(compound)
+                        //error - 'var' in compound local var decl
+                        reportSyntaxError(pos, Errors.VarNotAllowedCompound);
                     startPos = TreeInfo.getStartPos(mods);
                     if (startPos == Position.NOPOS)
                         startPos = TreeInfo.getStartPos(type);
--- a/test/langtools/tools/javac/parser/JavacParserTest.java	Tue Nov 20 13:12:48 2018 +0000
+++ b/test/langtools/tools/javac/parser/JavacParserTest.java	Tue Nov 20 21:59:07 2018 +0530
@@ -1041,6 +1041,28 @@
         assertEquals("the error message is not correct, actual: " + actualErrors, expectedErrors, actualErrors);
     }
 
+    @Test //JDK-821742
+    void testCompDeclVarType() throws IOException {
+        String code = "package test; public class Test {"
+                + "private void test() {"
+                + "var v1 = 10,v2 = 12;"
+                + "} private Test() {}}";
+
+        JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, fm, null,
+                null, null, Arrays.asList(new MyFileObject(code)));
+        CompilationUnitTree cut = ct.parse().iterator().next();
+        ct.enter();
+        ct.analyze();
+        ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
+        MethodTree method = (MethodTree) clazz.getMembers().get(0);
+        VariableTree stmt1 = (VariableTree) method.getBody().getStatements().get(0);
+        VariableTree stmt2 = (VariableTree) method.getBody().getStatements().get(1);
+        Tree v1Type = stmt1.getType();
+        Tree v2Type = stmt2.getType();
+        assertEquals("Implicit type for v1 is not correct: ", Kind.PRIMITIVE_TYPE, v1Type.getKind());
+        assertEquals("Implicit type for v2 is not correct: ", Kind.PRIMITIVE_TYPE, v2Type.getKind());
+    }
+
     @Test
     void testCaseBodyStatements() throws IOException {
         String code = "class C {" +