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