On Tue, 13 Jan 2026 20:28:02 GMT, Vicente Romero <[email protected]> wrote:
> According to spec bugs: JDK-8373719 and JDK-8373721:
>
> In JLS 6.5.6.1, references to fields are subject to a handful of restrictions
> if they refer to instance fields. In 15.8 and 15.11, 'this.x' and 'super.x'
> are intended to be viewed as instance field references, and subject to the
> same restrictions.
>
> So the following code should fail to compile:
>
> class Test {
> static final boolean check = true;
> Test(int a) {
> boolean b = Test.this.check; //compilation error expected here
> this();
> }
> }
>
> However, javac is currently accepting it
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 1397:
> 1395: } else if (mode ==
> PrologueVisitorMode.THIS_CONSTRUCTOR &&
> 1396:
> TreeInfo.isThisOrSelectorDotThis(subtree) &&
> 1397: TreeInfo.isExplicitThisReference(
It's a bit sad we have to add an extra check when in reality
`isExplicitThisReference` already does what we need -- but is too broad (and
confusingly named) as it also picks up `super`.
For this PR we're fine. In the future I'd like to see `isExplicitThisReference`
split into two parts:
* `isExplicitThisReference`
* `isExplicitSuperReference`
And then a method can be defined which does the OR:
* `isExplicitThisOrSuperReference
Then your check could only use one of them, whereas the rest of javac can use
the OR method.
test/langtools/tools/javac/SuperInit/SuperInitFails.java line 315:
> 313: Inner12() {}
> 314: Inner12(int a) {
> 315: boolean b = Inner12.this.check; //compilation error expected
> here
Maybe could be good to add tests where you have some `Foo.this` but where `Foo`
is an enclosing outer class (e.g. where it's not truly a reference to the
`this` being constructed)
-------------
PR Review Comment:
https://git.openjdk.org/valhalla/pull/1899#discussion_r2720781575
PR Review Comment:
https://git.openjdk.org/valhalla/pull/1899#discussion_r2720786450