RFR: 8334248: Invalid error for early construction local class constructor method reference [v3]

Archie Cobbs acobbs at openjdk.org
Sat Jun 15 15:28:40 UTC 2024


> The new "flexible constructors" JEP 482 specifies that a local class declared in an early construction context does not have an immediate outer instance, i.e., it has the same behavior as an anonymous class would in that situation.
> 
> However, the compiler still (incorrectly) tries to verify that an outer instance exists in the case of a method reference to the local class' constructor.
> 
> Example:
> 
> 
> 
> import java.util.function.Supplier;
> 
> class EarlyLocalCtorRef {
> 
>     EarlyLocalCtorRef() {
>         class InnerLocal { }
>         this(InnerLocal::new);
>     }
> 
>     EarlyLocalCtorRef(Supplier<Object> s) {
>     }
> }
> 
> 
> Expected output: Successful compilation.
> 
> Actual output:
> 
> 
> EarlyLocalCtorRef.java:5: error: cannot reference this before supertype constructor has been called
>         this(InnerLocal::new);
>              ^ 
> 
> 
> The fix is to not look for an implicit outer instance for classes that don't have one when encountering a constructor method reference.
> 
> **NOTE:** The test added here will fail until [JDK-8333313](https://bugs.openjdk.org/browse/JDK-8333313) is fixed.

Archie Cobbs has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision:

 - Refactor resolveImplicitThis() to respect actual outer instance.
 - Add Maurizio's innermostAccessibleEnclosingClass() and hasOuterInstance().
 - Merge branch 'master' into JDK-8334248
 - Future-proof bug fix vs. new & improved semantics of hasOuterInstance().
 - Don't require outer instance for early construction local class method ref.

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/19705/files
  - new: https://git.openjdk.org/jdk/pull/19705/files/0e7496b9..e0f5d183

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=19705&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19705&range=01-02

  Stats: 2201 lines in 112 files changed: 1682 ins; 185 del; 334 mod
  Patch: https://git.openjdk.org/jdk/pull/19705.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19705/head:pull/19705

PR: https://git.openjdk.org/jdk/pull/19705


More information about the compiler-dev mailing list