--- old/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java 2018-01-11 14:46:38.935903218 -0800 +++ new/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java 2018-01-11 14:46:38.559715202 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, 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 @@ -761,7 +761,7 @@ public JCExpression unannotatedType(boolean allowVar) { JCExpression result = term(TYPE); - if (!allowVar && isRestrictedLocalVarTypeName(result)) { + if (isRestrictedLocalVarTypeName(result) && !allowVar) { syntaxError(result.pos, "var.not.allowed.here"); } @@ -2955,6 +2955,12 @@ T vdefs, boolean localDecl) { + JCTree elemType = TreeInfo.innermostType(type, true); // bracketsOpt needed? + if (elemType.hasTag(IDENT)) { + Name typeName = ((JCIdent)elemType).name; + boolean typeNameVarCheck = isRestrictedLocalVarTypeName(typeName, elemType.pos); + } + JCVariableDecl head = variableDeclaratorRest(pos, mods, type, name, reqInit, dc, localDecl); boolean implicit = Feature.LOCAL_VARIABLE_TYPE_INFERENCE.allowedInSource(source) && head.vartype == null; vdefs.append(head); @@ -2996,7 +3002,7 @@ int startPos = Position.NOPOS; if (Feature.LOCAL_VARIABLE_TYPE_INFERENCE.allowedInSource(source) && elemType.hasTag(IDENT)) { Name typeName = ((JCIdent)elemType).name; - if (isRestrictedLocalVarTypeName(typeName)) { + if (isRestrictedLocalVarTypeName(typeName, elemType.pos)) { if (type.hasTag(TYPEARRAY)) { //error - 'var' and arrays reportSyntaxError(pos, "var.not.allowed.array"); @@ -3019,7 +3025,7 @@ boolean isRestrictedLocalVarTypeName(JCExpression e) { switch (e.getTag()) { case IDENT: - return isRestrictedLocalVarTypeName(((JCIdent)e).name); + return isRestrictedLocalVarTypeName(((JCIdent)e).name, e.pos); case TYPEARRAY: return isRestrictedLocalVarTypeName(((JCArrayTypeTree)e).elemtype); default: @@ -3027,8 +3033,15 @@ } } - boolean isRestrictedLocalVarTypeName(Name name) { - return Feature.LOCAL_VARIABLE_TYPE_INFERENCE.allowedInSource(source) && name == names.var; + boolean isRestrictedLocalVarTypeName(Name name, int pos) { + if (name == names.var) { + if (Feature.LOCAL_VARIABLE_TYPE_INFERENCE.allowedInSource(source)) { + return true; + } else { + warning(pos, "var.not.allowed", name); + } + } + return false; } /** VariableDeclaratorId = Ident BracketsOpt @@ -3403,7 +3416,7 @@ Name typeName() { int pos = token.pos; Name name = ident(); - if (isRestrictedLocalVarTypeName(name)) { + if (isRestrictedLocalVarTypeName(name, pos)) { reportSyntaxError(pos, "var.not.allowed", name); } return name;