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