Integrated: 8329951: `var` emits deprecation warnings that do not point to the file or position
Archie Cobbs
acobbs at openjdk.org
Tue Jun 3 14:38:06 UTC 2025
On Tue, 18 Feb 2025 23:49:10 GMT, Archie Cobbs <acobbs at openjdk.org> wrote:
> This PR fixes a bug that causes certain warnings to be emitted without source file location information.
>
> Consider this example:
>
> import java.util.*;
> import java.util.function.*;
> public class Example {
>
> @SuppressWarnings("deprecation")
> List<Observable> m1() { return null; }
>
> void m2() {
> for (var o : m1()) { }
> }
> }
>
> the compiler outputs this:
>
> $ javac -Xlint:deprecation Example.java
> warning: [deprecation] Observable in java.util has been deprecated
> 1 warning
>
> but it should instead output this:
>
> Example.java:9: warning: [deprecation] Observable in java.util has been deprecated
> for (var o : m1()) { }
> ^
> 1 warning
>
> The bug happens because the "synthetic" type that is installed dynamically for implicitly typed variables is not given a source code position. This makes some sense (?) because that type doesn't literally appear in the variable declaration; however, certain error messages expect to be able to point to the type portion of a variable declaration, so it also causes this bug (and presumably similar variants). To fix this, we just copy the position of the variable declaration itself to the synthetic type.
>
> However, this change necessitated another change: The fix for [JDK-8200199](https://bugs.openjdk.org/browse/JDK-8200199) added back in 2018 relies on the fact that the position of an implicitly typed variable is always null, so this change breaks that fix. But since then, a new method `JCVariableDecl.declaredUsingVar()` was added, so we can just use that test instead. This also makes the code a little clearer.
This pull request has now been integrated.
Changeset: e2f73665
Author: Archie Cobbs <acobbs at openjdk.org>
URL: https://git.openjdk.org/jdk/commit/e2f736658fbd03d2dc2186dbd9ba9b13b1f1a8ac
Stats: 43 lines in 4 files changed: 35 ins; 4 del; 4 mod
8329951: `var` emits deprecation warnings that do not point to the file or position
Reviewed-by: vromero
-------------
PR: https://git.openjdk.org/jdk/pull/23683
More information about the compiler-dev
mailing list