On Wed, 4 May 2022 10:03:13 GMT, Maurizio Cimadamore <[email protected]>
wrote:
>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 4180:
>>
>>> 4178: type = attribTree(tree.var.vartype, env, varInfo);
>>> 4179: } else {
>>> 4180: type = resultInfo.pt;
>>
>> Looks good - infers the binging var type from the record component being
>> processed. If not in a record, then I suspect resultInfo.pt is just the
>> target expression type (e.g. var in toplevel environment).
>
> That said, I'm not sure how this connects with `instanceof`. This patch
> doesn't seem to alter `visitTypeTest`. In the current code I can see this:
>
> if (tree.pattern.getTag() == BINDINGPATTERN ||
> tree.pattern.getTag() == PARENTHESIZEDPATTERN) {
> attribTree(tree.pattern, env, unknownExprInfo);
> ...
>
>
> This seems wrong for two reasons:
>
> * it doesn't take into account the new pattern tag
> * it uses an "unknown" result info when attributing, meaning that any
> toplevel `var` pattern will not be attributed correctly
>
> But we seem to have tests covering record patterns and instanceof. so I'm
> wondering if I'm missing some code update?
Some of the handling inside this ifs is only needed for type test and
parenthesized patterns (as record patterns are never unconditional (total)). I
have an upcoming patch that should improve the tests here, however.
For `var` - the specification does not allow `var` at the top level (14.30.1,
"The LocalVariableType in a top-level type pattern denotes a reference type
(and furthermore is not var)."). In my upcoming patch, I am adding a test to
ensure meaningful behavior for top-level type test patterns with `var`.
-------------
PR: https://git.openjdk.java.net/jdk/pull/8516