How to repro:
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
@NullMarked
public class Foo {
public interface Supplier<T extends @Nullable Object> extends java.util.function.Supplier<T> {
}
public static void waitForAll(Runnable callback, Supplier... suppliers) {
}
public static void test(Supplier<Object> sup2) {
waitForAll(() -> {}, sup2);
}
}
Changing waitForAll to use Supplier<?> rather than Supplier fixes the crash.
Foo.java:16: error: An unhandled exception was thrown by the Error Prone static analysis plugin.
waitForAll(() -> {}, sup2);
^
Please report this at https://github.com/google/error-prone/issues/new and include the following:
error-prone version: 2.36.0
BugPattern: NullAway
Stack Trace:
java.lang.RuntimeException: Number of types arguments in Foo.Supplier<java.lang.Object> does not match Foo.Supplier
at com.uber.nullaway.generics.CheckIdenticalNullabilityVisitor.visitClassType(CheckIdenticalNullabilityVisitor.java:52)
at com.uber.nullaway.generics.CheckIdenticalNullabilityVisitor.visitClassType(CheckIdenticalNullabilityVisitor.java:15)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1053)
at com.uber.nullaway.generics.GenericsChecks.identicalTypeParameterNullability(GenericsChecks.java:491)
at com.uber.nullaway.generics.GenericsChecks.subtypeParameterNullability(GenericsChecks.java:520)
at com.uber.nullaway.generics.GenericsChecks.compareGenericTypeParameterNullabilityForCall(GenericsChecks.java:667)
at com.uber.nullaway.NullAway.handleInvocation(NullAway.java:1889)
at com.uber.nullaway.NullAway.matchMethodInvocation(NullAway.java:401)
at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:509)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethodInvocation(ErrorProneScanner.java:824)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethodInvocation(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1873)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:92)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.visitExpressionStatement(TreeScanner.java:504)
at com.google.errorprone.scanner.ErrorProneScanner.visitExpressionStatement(ErrorProneScanner.java:711)
at com.google.errorprone.scanner.ErrorProneScanner.visitExpressionStatement(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1652)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:92)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:110)
at jdk.compiler/com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:271)
at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:591)
at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1145)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:92)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:95)
at jdk.compiler/com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:223)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:818)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:989)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:92)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:95)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:110)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:118)
at jdk.compiler/com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:202)
at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:619)
at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:896)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:92)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:110)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:118)
at jdk.compiler/com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:151)
at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:631)
at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:625)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:66)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:58)
at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:227)
at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:133)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1432)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1379)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:964)
at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:319)
at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:178)
at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:66)
at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:52)
1 error
1 warning
printing javac parameters to: /tmp/javac.20250226_162924.args
Contents of: /tmp/javac.20250226_162924.args:
# javac crashed, this report includes the parameters passed to it in the @-file format
-g
--release
17
-encoding
UTF-8
-sourcepath
:
-Xlint:-dep-ann
-Xlint:-removal
-XDcompilePolicy=simple
"-Xplugin:ErrorProne -XepOpt:NullAway:AnnotatedPackages= -XepOpt:NullAway:CustomContractAnnotations=org.chromium.build.annotations.Contract -XepOpt:NullAway:CheckContracts=true -XepOpt:NullAway:CastToNonNullMethod=org.chromium.build.NullUtil.assumeNonNull -XepOpt:NullAway:AssertsEnabled=true -XepOpt:NullAway:AcknowledgeRestrictiveAnnotations=true -XepOpt:Nullaway:AcknowledgeAndroidRecent=true -XepOpt:NullAway:JSpecifyMode=true -XepOpt:NullAway:KnownInitializers=android.app.Application.onCreate,android.app.Activity.onCreate,android.app.Service.onCreate,android.app.backup.BackupAgent.onCreate,android.content.ContentProvider.attachInfo,android.content.ContentProvider.onCreate,android.content.ContentWrapper.attachBaseContext -XepAllErrorsAsWarnings -XepDisableWarningsInGeneratedCode -Xep:InlineMeInliner:OFF -Xep:InlineMeSuggester:OFF -Xep:HidingField:OFF -Xep:AlreadyChecked:OFF -Xep:DirectInvocationOnMock:OFF -Xep:MockNotUsedInProduction:OFF -Xep:JdkObsolete:OFF -Xep:ReturnValueIgnored:OFF -Xep:StaticAssignmentInConstructor:OFF -Xep:InvalidBlockTag:OFF -Xep:InvalidParam:OFF -Xep:InvalidLink:OFF -Xep:InvalidInlineTag:OFF -Xep:MalformedInlineTag:OFF -Xep:MissingSummary:OFF -Xep:UnescapedEntity:OFF -Xep:UnrecognisedJavadocTag:OFF -Xep:MutablePublicArray:OFF -Xep:NonCanonicalType:OFF -Xep:DoNotClaimAnnotations:OFF -Xep:JavaUtilDate:OFF -Xep:IdentityHashMapUsage:OFF -Xep:StaticMockMember:OFF -Xep:StaticAssignmentOfThrowable:OFF -Xep:CatchAndPrintStackTrace:OFF -Xep:TypeParameterUnusedInFormals:OFF -Xep:DefaultCharset:OFF -Xep:FutureReturnValueIgnored:OFF -Xep:ThreadJoinLoop:OFF -Xep:StringSplitter:OFF -Xep:ClassNewInstance:OFF -Xep:ThreadLocalUsage:OFF -Xep:EqualsHashCode:OFF -Xep:OverrideThrowableToString:OFF -Xep:UnsafeReflectiveConstructionCast:OFF -Xep:MixedMutabilityReturnType:OFF -Xep:EqualsGetClass:OFF -Xep:UndefinedEquals:OFF -Xep:SameNameButDifferent:OFF -Xep:UnnecessaryLambda:OFF -Xep:EmptyCatch:OFF -Xep:BadImport:OFF -Xep:UseCorrectAssertInTests:OFF -Xep:RefersToDaggerCodegen:OFF -Xep:RemoveUnusedImports:OFF -Xep:UnicodeEscape:OFF -Xep:NonApiType:OFF -Xep:StringCharset:OFF -Xep:StringCaseLocaleUsage:OFF -Xep:RedundantControlFlow:OFF -Xep:BinderIdentityRestoredDangerously:WARN -Xep:EmptyIf:WARN -Xep:EqualsBrokenForNull:WARN -Xep:InvalidThrows:WARN -Xep:LongLiteralLowerCaseSuffix:WARN -Xep:MultiVariableDeclaration:WARN -Xep:RedundantOverride:WARN -Xep:StaticQualifiedUsingExpression:WARN -Xep:TimeUnitMismatch:WARN -Xep:UnnecessaryStaticImport:WARN -Xep:UseBinds:WARN -Xep:WildcardImport:WARN -Xep:NoStreams:WARN"
-XDshould-stop.ifError=FLOW
-proc:none
-processorpath
lib.java/tools/android/errorprone_plugin/errorprone_plugin.jar:lib.java/build/android/build_java.jar:lib.java/third_party/android_build_tools/error_prone/error_prone_java.jar:lib.java/third_party/android_build_tools/error_prone_javac/error_prone_javac_java.jar:../../third_party/android_build_tools/nullaway/cipd/nullaway.jar
-classpath
../../third_party/android_deps/cipd/libs/org_jspecify_jspecify/jspecify-1.0.0.jar:obj/build/android/build_java.turbine.jar:.
Foo.java
How to repro:
Changing
waitForAllto useSupplier<?>rather thanSupplierfixes the crash.Contents of:
/tmp/javac.20250226_162924.args: