On Wed, 4 May 2022 10:03:13 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
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

Reply via email to