RFR: JDK14-8236005: local records shouldn't capture any non-static state from any enclosing type

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Jan 13 14:46:31 UTC 2020


Thanks for the explanation. I've convinced myself that the code is 
correct. Basically, if we're trying to access a local variable defined 
in a method whose class is != than the current class && the current 
class is also static (which can only happen with records, as that's the 
only local construct which can also be static), an error should be issued.

Maurizio

On 13/01/2020 13:39, Vicente Romero wrote:
>
>
> On 1/10/20 8:02 PM, Maurizio Cimadamore wrote:
>>
>>
>> On 10/01/2020 22:53, Vicente Romero wrote:
>>> but this code is accepted:
>>>
>>> class R {
>>>      void m() {
>>>          int z = 0;
>>>          record RR(int x) { public int x() { return z; }};
>>>      }
>>> }
>>
>> Why is this accepted? Isn't capture of locals also disabled, as 
>> demonstrated in the test:
>>
>> // Cant capture locals
>> + assertFail("compiler.err.non-static.cant.be.ref",
>> + "class R { \n" +
>>                   "    void m(int y) { \n" +
>>                   "        record RR(int x) { public int x() { return y; }};\n" +
>>                   "    }\n" +
>>                   "}");
> sorry I should have been more specific. When I said: "with the current 
> conditions" in my previous mail I should had said: "with current state 
> without the patch this code is accepted" that's what I meant. Without 
> the patch access to non-static fields from records are banned but 
> access to local variables is not. This patch is closing that last gap
>
> Vicente
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20200113/68d012a1/attachment.htm>


More information about the compiler-dev mailing list