On Fri, 29 Aug 2025 10:57:11 GMT, Vicente Romero <[email protected]> wrote:

>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 1449:
>> 
>>> 1447:                              * not allowed in the prologue
>>> 1448:                              */
>>> 1449:                             if (insideLambdaOrClassDef ||
>> 
>> I'm not entirely convinced about these checks. They seem to lead to very 
>> strange asymmetries:
>> 
>> 
>> import java.util.function.*;
>> 
>> class Test3 {
>> 
>>     int x = 4;
>>     int y;
>> 
>>     Test3() {
>>         System.out.println(x); //error
>>         Supplier<Integer> s1 = () -> x; // error
>>         y = 2;
>>         System.out.println(y); // ok
>>         Supplier<Integer> s2 = () -> y; // error
>>         super();
>>     }
>> }
>> 
>> 
>> I understand that references to `x` are invalid here -- `x` is not a strict 
>> field, so it will be initialized _after_ the prologue. So the first couple 
>> of references are errors, fine.
>> 
>> But in the last couple, we have that `print(x)` is good, but the reference 
>> from the lambda is flagged as an error. I'm not sure what's the rationale 
>> here? After all the lambda is defined _after_ `y` has been assigned, so what 
>> are we trying to protect against?
>
> I think that the idea of restricting the access from lambdas and local 
> classes is that they will capture `this` in order to access the field(s)

Ah! Forgot about that one -- but... with proxy locals that's no longer the 
case, no?

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

PR Review Comment: 
https://git.openjdk.org/valhalla/pull/1523#discussion_r2310221250

Reply via email to