From dc44d4338b698edc7ccf3103e30971e0152080ed Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 Apr 2026 13:27:01 -0700 Subject: [PATCH 1/3] WIP --- .../com/uber/nullaway/generics/GenericsChecks.java | 3 ++- .../com/uber/nullaway/jspecify/WildcardTests.java | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java index 81d539c4bf..db28c84d75 100644 --- a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java +++ b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java @@ -1618,10 +1618,11 @@ public void compareGenericTypeParameterNullabilityForCall( } } }); + maybeStorePolyExpressionTypeFromTarget(currentActualParam, formalParameter); return; } - Type actualParameterType = null; + Type actualParameterType; if (currentActualParam instanceof LambdaExpressionTree) { maybeStorePolyExpressionTypeFromTarget(currentActualParam, formalParameter); } diff --git a/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java b/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java index a7a71ee31b..b926b15f26 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java @@ -538,14 +538,21 @@ interface Consumer { return null; } static void callHashCode(Object o) { o.hashCode(); } - static void test(List list) { + static void doNothing(@Nullable Object o) {} + static void testPositive(List list) { list.stream().map(Test::mapToNull).forEach(s -> { // BUG: Diagnostic contains: dereferenced expression s is @Nullable s.hashCode(); }); - // TODO we should report an error here (https://github.com/uber/NullAway/issues/1552) + // BUG: Diagnostic contains: parameter o of referenced method is @NonNull, but parameter in functional interface method Test.Consumer.accept(T) is @Nullable list.stream().map(Test::mapToNull).forEach(Test::callHashCode); } + static void testNegative(List list) { + list.stream().map(Test::mapToNull).forEach(s -> { + if (s != null) { s.hashCode(); } + }); + list.stream().map(Test::mapToNull).forEach(Test::doNothing); + } }""") .doTest(); } From 1a2c03bc1c5125c316fcc79d85d722097419ec3a Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 Apr 2026 14:01:32 -0700 Subject: [PATCH 2/3] undo change --- .../main/java/com/uber/nullaway/generics/GenericsChecks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java index db28c84d75..069ea3fdd1 100644 --- a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java +++ b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java @@ -1622,7 +1622,7 @@ public void compareGenericTypeParameterNullabilityForCall( return; } - Type actualParameterType; + Type actualParameterType = null; if (currentActualParam instanceof LambdaExpressionTree) { maybeStorePolyExpressionTypeFromTarget(currentActualParam, formalParameter); } From f379612c5350bea29eb1976362c0f427feb28dd1 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 2 May 2026 18:25:17 -0700 Subject: [PATCH 3/3] improve test --- .../src/test/java/com/uber/nullaway/jspecify/WildcardTests.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java b/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java index b926b15f26..4d00e26882 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/WildcardTests.java @@ -537,6 +537,7 @@ interface Consumer { static @Nullable String mapToNull(String s) { return null; } + static String id(String s) { return s; } static void callHashCode(Object o) { o.hashCode(); } static void doNothing(@Nullable Object o) {} static void testPositive(List list) { @@ -552,6 +553,7 @@ static void testNegative(List list) { if (s != null) { s.hashCode(); } }); list.stream().map(Test::mapToNull).forEach(Test::doNothing); + list.stream().map(Test::id).forEach(Test::callHashCode); } }""") .doTest();