RFR: 8295019: Cannot call a method with a parameter of a local class declared in a lambda [v2]

Vicente Romero vromero at openjdk.org
Thu Feb 2 19:57:24 UTC 2023


On Thu, 2 Feb 2023 00:22:06 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java line 462:
>> 
>>> 460:     }
>>> 461: 
>>> 462:     boolean hasTypeDeclaration(JCLambda lambda) {
>> 
>> This is a good start.
>> A couple of comments:
>> * I believe this problem is more general than just lambdas (e.g. switch expression probably suffers from that as well)
>> * It would be better to write a single visitor which does everything in a single pass, rather than visit every statement in a block explicitly (after all, that's what the visitor is gonna do anyways). I even believe the visitor should recurse into everything (including nested lambdas and classes - after all, a class _nested_ in a local class might have a type which is then referred by the lambda return type!).
>
> This is the equivalent bug with switch expression:
> 
> 
> class LocalClassDeclaredInsideSwitchTest {
>     void run(int i) {}
> 
>     void m(int o) {
>         run(switch(o) {
>           case 1 -> {
>             class C {
>                 static int takeC(C c) {}
>                 static C giveC() {
>                     return null;
>                 }
>             }
>             yield C.takeC(C.giveC());
>          }
>          default -> throw new AssertionError();
>        });
>     }
> }
> 
> 
> We should come up with a fix that is general enough to handle all these cases.

right, I forgot about that case, uploaded a new iteration, thanks!

-------------

PR: https://git.openjdk.org/jdk/pull/12303


More information about the compiler-dev mailing list