Skip to content

jdk11: NPE at javac's ClassReader when reading .class file of object member of traits #9200

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ohze opened this issue Jun 18, 2020 · 3 comments · Fixed by #10319
Closed

jdk11: NPE at javac's ClassReader when reading .class file of object member of traits #9200

ohze opened this issue Jun 18, 2020 · 3 comments · Fixed by #10319

Comments

@ohze
Copy link

ohze commented Jun 18, 2020

Minimized code

// T.scala
trait T { object O }
// J.java
class J { T.O$ o; }
% mkdir -p project src/main/scala src/main/java
% echo 'addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.1")' > project/plugins.sbt
% echo 'crossScalaVersions := Seq("2.13.2", "0.24.0")' > build.sbt
% echo 'trait T { object O }' > src/main/scala/T.scala
% echo 'class J { T.O$ o; }' > src/main/java/J.java

% java -version
openjdk version "1.8.0_252"

% sbt ";clean ;++compile"
// success

// switch to jdk 11
% jabba use adopt@1.11.0-7
% java -version
openjdk version "11.0.7" 2020-04-14

% sbt ";clean ;++2.13.2 compile"
// success

% sbt ";clean ;++0.24.0 compile"
[error] -- [E006] Not Found Error: /Users/thanhbv/tmp/ex/src/main/java/J.java:1:10 -----
[error] 1 |class J { T.O$ o; }
[error]   |          ^
[error]   |          Not found: T

% echo 'compileOrder := CompileOrder.ScalaThenJava' >> build.sbt

% sbt ";clean ;++0.24.0 compile"
// crash, see below

Output

[error] compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.7, {1}, {2}, {3}, {4}, {5}, {6}, {7}
[error] java.lang.NullPointerException
[error]         at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.setParameters(ClassReader.java:2562)
[error]         at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readMethod(ClassReader.java:2460)
[error]         at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:2736)
[error]         at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClassBuffer(ClassReader.java:2808)
[error]         at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:2821)
[error]         at jdk.compiler/com.sun.tools.javac.code.ClassFinder.fillIn(ClassFinder.java:359)
[error]         at jdk.compiler/com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:291)
[error]         at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:642)
[error]         at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1326)
[error]         at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:1259)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:405)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:389)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Resolve.findImmediateMemberType(Resolve.java:2171)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMemberType(Resolve.java:2226)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Resolve.findIdentInTypeInternal(Resolve.java:2422)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Resolve.findIdentInType(Resolve.java:2408)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Attr.selectSym(Attr.java:3731)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3601)
[error]         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2114)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Attr.attribType(Attr.java:715)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Attr.attribType(Attr.java:708)
[error]         at jdk.compiler/com.sun.tools.javac.comp.MemberEnter.visitVarDef(MemberEnter.java:264)
[error]         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:956)
[error]         at jdk.compiler/com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:163)
[error]         at jdk.compiler/com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:175)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$MembersPhase.finishClass(TypeEnter.java:958)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$MembersPhase.runPhase(TypeEnter.java:942)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.doCompleteEnvs(TypeEnter.java:282)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$MembersPhase.doCompleteEnvs(TypeEnter.java:877)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:251)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:266)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:266)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:266)
[error]         at jdk.compiler/com.sun.tools.javac.comp.TypeEnter.complete(TypeEnter.java:198)
[error]         at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:642)
[error]         at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1326)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Enter.complete(Enter.java:583)
[error]         at jdk.compiler/com.sun.tools.javac.comp.Enter.main(Enter.java:560)
[error]         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:1066)
[error]         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:937)
[error]         at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
[error]         at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
[error]         at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
[error]         at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
[error]         at sbt.internal.inc.javac.LocalJavaCompiler.run(LocalJava.scala:204)
[error]         at sbt.internal.inc.javac.AnalyzingJavaCompiler.$anonfun$compile$11(AnalyzingJavaCompiler.scala:158)
[error]         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error]         at sbt.internal.inc.javac.AnalyzingJavaCompiler.timed(AnalyzingJavaCompiler.scala:236)
[error]         at sbt.internal.inc.javac.AnalyzingJavaCompiler.compile(AnalyzingJavaCompiler.scala:148)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$5(MixedAnalyzingCompiler.scala:134)
[error]         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:186)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.compileJava$1(MixedAnalyzingCompiler.scala:100)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:146)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:343)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:343)
[error]         at sbt.internal.inc.Incremental$.doCompile(Incremental.scala:120)
[error]         at sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:100)
[error]         at sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:180)
[error]         at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:98)
[error]         at sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:102)
[error]         at sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:155)
[error]         at sbt.internal.inc.Incremental$.compile(Incremental.scala:92)
[error]         at sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:75)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:348)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:301)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:168)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:248)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:74)
[error]         at sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1765)
[error]         at sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1738)
[error]         at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error]         at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error]         at sbt.std.Transform$$anon$4.work(Transform.scala:67)
[error]         at sbt.Execute.$anonfun$submit$2(Execute.scala:281)
[error]         at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:19)
[error]         at sbt.Execute.work(Execute.scala:290)
[error]         at sbt.Execute.$anonfun$submit$1(Execute.scala:281)
[error]         at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error]         at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error]         at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error]         at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
[error]         at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error]         at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[error]         at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[error]         at java.base/java.lang.Thread.run(Thread.java:834)
[error] (Compile / compileIncremental) javac returned non-zero exit code

Expectation

Compile successfully as in scala 2 or in java 8.

Notes:
Even if we compile T.scala using java 8 then the output classes still can not be used in java 11:

% jabba use adopt@1.8.0-252
% dotc src/main/scala/T.scala
% jabba use adopt@1.11.0-7
% javac -cp . src/main/java/J.java
// same NPE error

Because this issue, libraries built with java 8 can not be used in java 11

@griggt
Copy link
Contributor

griggt commented Nov 14, 2020

This looks to be fixed by #8652.

@bishabosha
Copy link
Member

bishabosha commented Dec 22, 2020

@ohze I tried the steps you mentioned above, but with AdoptOpenJDK (build 11.0.9+11), Scala 2.13.4 and 3.0.0-M3 and there was no crash on the final step as you mentioned, could you confirm if we can close the issue?
(meaning the crash is resolved. #10868 would stay open for the issue of compile order)
we will then merge #10319

@ohze
Copy link
Author

ohze commented Dec 24, 2020

@bishabosha Yes. The issue is fixed.

@ohze ohze closed this as completed Dec 24, 2020
griggt added a commit to griggt/dotty that referenced this issue Apr 26, 2021
nicolasstucki added a commit that referenced this issue Apr 29, 2021
michelou pushed a commit to michelou/scala3 that referenced this issue Apr 29, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants