RFR: 8193904: Uninitialized final field access and qualified this
Alex Buckley
alex.buckley at oracle.com
Tue Nov 29 18:35:34 UTC 2022
IIRC this javac change first requires a JLS change to specify the
analysis of the receiver (the entity whose self is being accessed via
qualified this).
Alex
On 11/29/2022 9:40 AM, Vicente Romero wrote:
> Hi,
>
> I think that given that we are so close to closing the development for
> 20 that we push this early on 21 after the fork for 20 has been done,
>
> Thanks,
> Vicente
>
> On 11/28/22 12:45, Archie Cobbs wrote:
>> It looks like nobody wants to do anything about this issue.
>>
>> If that's the case, could someone please close JDK-8193904
>> <https://bugs.openjdk.org/browse/JDK-8193904> (and then I'll retract
>> my PR)?
>>
>> Thanks,
>> -Archie
>>
>> On Fri, Nov 18, 2022 at 9:49 AM Archie Cobbs <archie.cobbs at gmail.com>
>> wrote:
>>
>> On Wed, Nov 2, 2022 at 3:18 PM Archie Cobbs
>> <archie.cobbs at gmail.com> wrote:
>>
>> On Wed, Nov 2, 2022 at 2:47 PM Alex Buckley
>> <alex.buckley at oracle.com> wrote:
>>
>> JLS ch.16 is specific that only `foo` and `this.foo` cause
>> an error. See
>> the definition of "access" in the opening paragraphs of
>> the chapter.
>>
>>
>> Thanks for pointing that out, which I forgot to do. The JLS
>> language is:
>>
>> An access to its value consists of the simple name of the
>> variable (or, for a field, the simple name of the field
>> qualified by |this|) occurring anywhere in an expression
>> except as the left-hand operand of the simple assignment
>> operator |=| ||
>>
>> In theory one could argue that MyClass.this.foo is also an
>> example of "the simple name of the field qualified by |this" -
>> just look at the latter part, no?
>> |
>> |
>> |
>> Regardless, it looks like there needs to be a spec change...
>> right? I'm assuming we'd rather do that than continue to allow
>> the current behavior.
>>
>> Any further thoughts on this one?
>>
>> It seems to me that regardless of what you think the right answer
>> is, the current situation could use some improvement.
>>
>> Here's how the compiler currently behaves:
>>
>> // This class compiles without error
>> public class Example1 {
>> final int foo;
>> public Example1() {
>> System.err.println(Example1.this.foo); // no error generated here
>> this.foo = 42;
>> }
>> }
>>
>> // This class fails to compile
>> public class Example2 {
>> private final int foo;
>> public Example2() {
>> Example2.this.foo = 42; // "cannot assign a value to final
>> variable foo"
>> }
>> }
>>
>> My thoughts...
>>
>> * If the compiler is not following the spec, then we need to fix
>> the compiler
>> * If the compiler is following the spec, then shouldn't the spec
>> be corrected so that it treats Foo.this and this the same way?
>>
>> In another email Alex said:
>>
>> DU/DA analysis is about whether names have bindings. `x.foo`
>> and `new
>>
>> C().foo` and `m().foo` are expressions, not names, so we don't
>> attempt
>> the analysis on them. As Jan points out [1], access via
>> expressions is
>> hard to track. `this.foo` is an expression, but a very easy
>> one, so we
>> treat it like the name `foo` and do the analysis.
>> `A.B.C.this.foo` is an
>> expression with a qualified-this subexpression and now you
>> need a bunch
>> of analysis to figure out whether it means the same as the
>> name `foo`.
>>
>>
>> I don't see that you "need a bunch of analysis". The required
>> analysis is already being done, for example, when handling
>> expressions that could refer to outer 'this' instances. We're not
>> talking about arbitrarily complex expressions. The only two
>> options are 'this' or 'this' qualified by a type name.
>>
>> Apologies if I'm missing something, just trying to understand what
>> the issue is here.
>>
>>
>> --
>> Archie L. Cobbs
>
More information about the compiler-dev
mailing list