JDK 10/11 RFR of JDK-8189146: Have use of "var" in 9 and earlier source versions issue a warning
joe darcy
joe.darcy at oracle.com
Thu Jan 11 22:52:52 UTC 2018
Hi Maurizio,
On 1/9/2018 4:39 PM, Maurizio Cimadamore wrote:
> Thanks for the update. This is close, but compared to the existing
> golden file, as you noticed, there are missing warnings, esp. when
> 'var' is used as an array element type.
>
> I believe the issue is with this code:
>
> if (Feature.LOCAL_VARIABLE_TYPE_INFERENCE.allowedInSource(source) &&
> elemType.hasTag(IDENT)) {
> 2998 Name typeName = ((JCIdent)elemType).name;
> 2999 if (isRestrictedLocalVarTypeName(typeName, pos)) {
> 3000 if (type.hasTag(TYPEARRAY)) {
> 3001 //error - 'var' and arrays
> 3002 reportSyntaxError(pos, "var.not.allowed.array");
> 3003 } else {
> 3004 startPos = TreeInfo.getStartPos(mods);
> 3005 if (startPos == Position.NOPOS)
> 3006 startPos = TreeInfo.getStartPos(type);
> 3007 //implicit type
> 3008 type = null;
> 3009 }
> 3010 }
> 3011 }
>
>
> Here, if LVTI is disabled, the 'isRestrictedLocalVarTypeName' call
> would not even take place, hence the missing warnings. I suggest to
> shuffle as follows:
>
> if (elemType.hasTag(IDENT)) {
> 2998 Name typeName = ((JCIdent)elemType).name;
> 2999 if (isRestrictedLocalVarTypeName(typeName, pos)) {
> 3000 if (type.hasTag(TYPEARRAY)) {
> 3001 //error - 'var' and arrays
> 3002 reportSyntaxError(pos, "var.not.allowed.array");
> 3003 } else {
> 3004 startPos = TreeInfo.getStartPos(mods);
> 3005 if (startPos == Position.NOPOS)
> 3006 startPos = TreeInfo.getStartPos(type);
> 3007 //implicit type
> 3008 type = null;
> 3009 }
> 3010 }
> 3011 }
When I tried that out, there were more warnings; too many actually,
there were double warnings issued in some cases:
/test/langtools/tools/javac/lvti/ParserTest.java:38: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
var x = null; //illegal
^
/test/langtools/tools/javac/lvti/ParserTest.java:38: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
var x = null; //illegal
^
and
/home/darcy/JDK/10/hg/test/langtools/tools/javac/lvti/ParserTest.java:49:
warning: as of release 10, 'var' is a restricted local variable type and
cannot be used for type declarations or as the element type of an array
var x9 = null, y = null; //illegal
^
/home/darcy/JDK/10/hg/test/langtools/tools/javac/lvti/ParserTest.java:49:
warning: as of release 10, 'var' is a restricted local variable type and
cannot be used for type declarations or as the element type of an array
var x9 = null, y = null; //illegal
^
Stepping back a bit, if "var" were added as a full new keyword then the
check for a use of "var" could occur within the ident() method, as is
done for underscore. However, since "var" is allowed its traditional use
in some contexts, the error/warning checks need to be dependent on the
syntactic context. For pre-10, only a syntactic check needs occur, e.g.
a construct like "var x = 5, y = 6" does not merit a warning about y
having a var type; although that check is needed in 10 and later.
Therefore I moved a check out to the method for the containing grammar
production:
http://cr.openjdk.java.net/~darcy/8189146.3/
I also changed the wording of the warning message slightly to be more
inclusive of the situations it was covering. (More precisely worded
warning could be given for different situations, but I don't think that
is strictly necessary.)
One "var" warning/error check occurs now in typeName, which catches
class/interface/enum/annotation/type var declaration usage, and needs to
occur in some way for at least certain idents occurring in variable
declarations, including in try-with-resources.
I made some updates to the ParserTest to better cover try-with-resources
and took a somewhat different tack to attempt to get the right set of
warnings issues. Unfortunately, there were duplicates here as well:
/test/langtools/tools/javac/lvti/ParserTest.java:38: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
var x = null; //illegal
^
/test/langtools/tools/javac/lvti/ParserTest.java:38: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
var x = null; //illegal
^
/test/langtools/tools/javac/lvti/ParserTest.java:50: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
final @DA var x10 = m(); //ok
^
/test/langtools/tools/javac/lvti/ParserTest.java:50: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
final @DA var x10 = m(); //ok
^
/test/langtools/tools/javac/lvti/ParserTest.java:51: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
@DA final var x11 = m(); //ok
^
/test/langtools/tools/javac/lvti/ParserTest.java:51: warning: as of
release 10, 'var' is a restricted local variable type and cannot be used
for type declarations or as the element type of an array
@DA final var x11 = m(); //ok
Hopefully any additional modifications needed will be minor!
Thanks,
-Joe
More information about the compiler-dev
mailing list