RFR: JDK-8235778: No compilation error reported when a record is declared in a local class

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Dec 12 12:34:38 UTC 2019


The patch is ok, but I'm still not super convinced about treatment of 
local records; example:

$ cat TestLocalRecord.java

class TestLocalRecord {
void m() {
    String s = "Hello!";
    record A() {
        void m() { System.out.println(s); }
    }
    new A().m();
}
}

$ javap -s TestLocalRecord\$1A.class Compiled from "TestLocalRecord.java"

final class TestLocalRecord$1A extends java.lang.Record {
   final java.lang.String val$s;
     descriptor: Ljava/lang/String;
   public TestLocalRecord$1A();
     descriptor: (Ljava/lang/String;)V

   void m();
     descriptor: ()V

   public java.lang.String toString();
     descriptor: ()Ljava/lang/String;

   public final int hashCode();
     descriptor: ()I

   public final boolean equals(java.lang.Object);
     descriptor: (Ljava/lang/Object;)Z
}

Note the mismatch between the descriptor of the canonical constructor 
and the source signature of the same. This record seems not to be "the 
whole state and nothing but the state" because of the presence of 
captured fields in there.

Maurizio


On 12/12/2019 00:40, Vicente Romero wrote:
> I have uploaded a new iteration at [1],
>
> Thanks for your comments,
> Vicente
>
> [1] http://cr.openjdk.java.net/~vromero/8235778/webrev.01/
>
> On 12/11/19 7:08 PM, Maurizio Cimadamore wrote:
>>
>> If sym.isLocal() returns true, is this check
>>
>> && (sym.owner.flags_field & STATIC) == 0)
>> Needed? Aren't we inside a record declaration that is contained in 
>> some local context (e.g. within a method body), whose immediate 
>> enclosing type is a type T? If so, isn't T always non-static? I guess 
>> yes, unless T is a record itself, like:
>>
>> void m() {
>>    record A() {
>>         record B() { }
>>    }
>> }
>>
>> The patch seems to be biased in favor of this - is it deliberate? 
>> (also there's no test around that). Should the spec say something?
>>
>> Maurizio
>>
>> On 11/12/2019 23:39, Vicente Romero wrote:
>>> Hi,
>>>
>>> Please review the fix for [1] at [2]. Records are not allowed to be 
>>> defined inside inner classes. This patch extends the check to local 
>>> inner classes which was missing.
>>>
>>> Thanks,
>>> Vicente
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8235778
>>> http://cr.openjdk.java.net/~vromero/8235778/webrev.00/
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20191212/acaeeff0/attachment.htm>


More information about the compiler-dev mailing list