RFR: 8268312: Compilation error with nested generic functional interface [v6]
Vicente Romero
vromero at openjdk.org
Mon Jul 11 18:03:40 UTC 2022
> Please review this PR, which is my proposal to fix an existing regression. This code:
>
>
> import java.util.Optional;
>
> class App {
> public static void main(String[] args) {
> Optional.of("").map(outer -> {
> Optional.of("")
> .map(inner -> returnGeneric(outer))
> .ifPresent(String::toString);
> return "";
> });
> }
>
> private static <RG> RG returnGeneric(RG generic) {
> return generic;
> }
> }
>
> is not accepted by javac but if the user passes the `-Xdiags:verbose` option then the code compiles. I tracked down the reason for this puzzling difference and I found that it is due to our diagnostic rewriters which can generate more detailed positions for error messages but in cases like the one above can trick the compiler to generate an error message too early. The code deciding if an error message should be deferred or not, depending on the position, is at `DeferredDiagnosticHandler::report`. We decide to do the rewriting if we are in diagnostics compact mode, this is why the error doesn't occur with the `-Xdiags:verbose` option. This fix will made some diagnostics to appear at a slightly different position, but won't make the compiler reject correct code. Comments?
>
> TIA
Vicente Romero has updated the pull request incrementally with one additional commit since the last revision:
another iteration, addressing review comments
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/5586/files
- new: https://git.openjdk.org/jdk/pull/5586/files/5380d4c6..6ccba3d5
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=5586&range=05
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=5586&range=04-05
Stats: 190 lines in 68 files changed: 2 ins; 65 del; 123 mod
Patch: https://git.openjdk.org/jdk/pull/5586.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/5586/head:pull/5586
PR: https://git.openjdk.org/jdk/pull/5586
More information about the compiler-dev
mailing list