Mandated/implicit parameters

Joseph D. Darcy joe.darcy at oracle.com
Tue Jun 7 01:54:09 UTC 2022


On 5/24/2022 8:52 AM, Alex Buckley wrote:
> On 5/23/2022 11:27 PM, Hannes Greule wrote:
>> I came across an oddity when using the Parameter#isImplicit()[1] method.
>> According to its documentation, it returns true if the parameter is 
>> implicitly
>> declared in source code. ...
>> However, it seems like the information is only embedded when compiling
>> with the -parameters flag.
>>
>> From my understanding of the given section in the JLS, the mandated flag
>> should *always* be emitted. Is this a bug, or am I missing something?
>
> In principle, the isImplicit() status of a parameter at run time 
> should not depend on whether -parameters was given at compile time. 
> Unfortunately, the class file bit that records "implicitly declared", 
> for use by isImplicit(), is located in the MethodParameters attribute 
> (JVMS 4.7.24) that is only emitted when -parameters is given.
>
> It would be legitimate to emit MethodParameters without -parameters, 
> so as to record `final` and "implicitly declared" but not the 
> parameter name, but at some cost to implementation complexity in 
> java.lang.reflect.
>
>> Looking into it a bit deeper, it also seems like the parameters of a 
>> compact
>> constructor for records are never marked as mandated, even when 
>> compiling with
>> the -parameters flag (but the MethodParameters attribute is always 
>> written
>> or record constructors).
>
> That is weird, and sounds like a javac bug.
>

JDK-8234908: consider if the MANDATED flag should be applied to record 
members added by the compiler
https://bugs.openjdk.org/browse/JDK-8234908

-Joe



More information about the compiler-dev mailing list