Skip to content
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

StringFormatter.showArg throws NullPointerException #13440

Closed
xuwei-k opened this issue Sep 1, 2021 · 4 comments · Fixed by #13441 or #13442
Closed

StringFormatter.showArg throws NullPointerException #13440

xuwei-k opened this issue Sep 1, 2021 · 4 comments · Fixed by #13441 or #13442

Comments

@xuwei-k
Copy link
Contributor

xuwei-k commented Sep 1, 2021

Compiler version

3.1.0-RC1 and 3.1.0-RC1-bin-20210831-adefa48-NIGHTLY

Minimized code

scalacOptions ++= Seq("-source", "3.0-migration")

scalaVersion := "3.1.0-RC1"
case class A(enum: List[Int] = Nil)

Output (click arrow to expand)

[error] ## Exception when compiling 1 sources to /Users/kenji/enum-null/target/scala-3.1.0-RC1/classes
[error] java.lang.NullPointerException
[error] dotty.tools.dotc.printing.Formatting$StringFormatter.showArg(Formatting.scala:39)
[error] dotty.tools.dotc.printing.Formatting$StringFormatter.treatArg(Formatting.scala:49)
[error] dotty.tools.dotc.printing.Formatting$StringFormatter.$anonfun$2(Formatting.scala:62)
[error] scala.collection.LazyZip2$$anon$1$$anon$2.next(LazyZipOps.scala:42)
[error] scala.collection.mutable.Growable.addAll(Growable.scala:62)
[error] scala.collection.mutable.Growable.addAll$(Growable.scala:57)
[error] scala.collection.mutable.ArrayBuilder.addAll(ArrayBuilder.scala:66)
[error] scala.collection.IterableOnceOps.toArray(IterableOnce.scala:1282)
[error] scala.collection.IterableOnceOps.toArray$(IterableOnce.scala:1276)
[error] scala.collection.AbstractIterable.toArray(Iterable.scala:919)
[error] scala.Array$.from(Array.scala:73)
[error] scala.collection.immutable.ArraySeq$.from(ArraySeq.scala:274)
[error] scala.collection.immutable.ArraySeq$.from(ArraySeq.scala:265)
[error] scala.collection.ClassTagIterableFactory$AnyIterableDelegate.from(Factory.scala:671)
[error] scala.collection.BuildFromLowPriority2$$anon$11.fromSpecific(BuildFrom.scala:112)
[error] scala.collection.BuildFromLowPriority2$$anon$11.fromSpecific(BuildFrom.scala:109)
[error] scala.collection.LazyZip2.map(LazyZipOps.scala:37)
[error] dotty.tools.dotc.printing.Formatting$StringFormatter.assemble(Formatting.scala:62)
[error] dotty.tools.dotc.core.Decorators$.i(Decorators.scala:276)
[error] dotty.tools.dotc.parsing.Scanners$Scanner.treatAsIdent$$anonfun$1(Scanners.scala:251)
[error] dotty.tools.dotc.reporting.NoExplanation.msg(Message.scala:132)
[error] dotty.tools.dotc.reporting.Message.message(Message.scala:87)
[error] dotty.tools.dotc.reporting.Message.isNonSensical(Message.scala:99)
[error] dotty.tools.dotc.reporting.HideNonSensicalMessages.isHidden(HideNonSensicalMessages.scala:16)
[error] dotty.tools.dotc.reporting.HideNonSensicalMessages.isHidden$(HideNonSensicalMessages.scala:10)
[error] dotty.tools.dotc.reporting.AbstractReporter.isHidden(AbstractReporter.scala:8)
[error] dotty.tools.dotc.reporting.Reporter.go$3$$anonfun$2(Reporter.scala:161)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.Option.foreach(Option.scala:437)
[error] dotty.tools.dotc.reporting.Reporter.go$1(Reporter.scala:174)
[error] dotty.tools.dotc.reporting.Reporter.issueIfNotSuppressed(Reporter.scala:184)
[error] dotty.tools.dotc.Run.reportSuspendedMessages$$anonfun$3$$anonfun$1(Run.scala:140)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.mutable.LinkedHashSet.foreach(LinkedHashSet.scala:127)
[error] dotty.tools.dotc.Run.dotty$tools$dotc$Run$suppressions$$$_$reportSuspendedMessages$$anonfun$1(Run.scala:140)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.Option.foreach(Option.scala:437)
[error] dotty.tools.dotc.Run$suppressions$.reportSuspendedMessages(Run.scala:140)
[error] dotty.tools.dotc.typer.TyperPhase.liftedTree1$1(TyperPhase.scala:60)
[error] dotty.tools.dotc.typer.TyperPhase.typeCheck$$anonfun$1(TyperPhase.scala:62)
[error] dotty.tools.dotc.core.Phases$Phase.monitor(Phases.scala:411)
[error] dotty.tools.dotc.typer.TyperPhase.typeCheck(TyperPhase.scala:63)
[error] dotty.tools.dotc.typer.TyperPhase.runOn$$anonfun$1(TyperPhase.scala:105)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.immutable.List.foreach(List.scala:333)
[error] dotty.tools.dotc.typer.TyperPhase.runOn(TyperPhase.scala:105)
[error] dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:261)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
[error] dotty.tools.dotc.Run.runPhases$5(Run.scala:272)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:280)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:289)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:222)
[error] dotty.tools.dotc.Run.compile(Run.scala:206)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
[error] dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:88)
[error] dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:192)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:247)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:182)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:210)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:175)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:173)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:459)
[error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:414)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:501)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:401)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:167)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:482)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:420)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2357)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2314)
[error] sbt.internal.io.Retry$.apply(Retry.scala:46)
[error] sbt.internal.io.Retry$.apply(Retry.scala:28)
[error] sbt.internal.io.Retry$.apply(Retry.scala:23)
[error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2310)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] sbt.Execute.work(Execute.scala:291)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] java.lang.Thread.run(Thread.java:748)
@som-snytt
Copy link
Contributor

som-snytt commented Sep 2, 2021

Maybe some interaction with incremental compilation, but the message is at treatAsIdent:

i"$name is now a keyword, write `$name` instead of $name to keep it as an identifier"

where toToken(name: SimpleName) -> handleMigration(kw: Token) -> treatAsIdent() where the name param is dropped and this.name is used.

That matters because finishNamed(Token, target: TokenData) passes target.name, which could be different from this.name (which might be null).

The name should be passed down the stack to treatAsIdent.

It would also be great to run under modern JVM with "helpful NPE", but in this case it's arg.toString that throws, where the arg is the name in the interpolation.

edit

java.lang.NullPointerException: Cannot invoke "Object.toString()" because "arg" is null while compiling keyword.scala

@griggt
Copy link
Collaborator

griggt commented Sep 2, 2021

Regressed in #12857

griggt added a commit to griggt/dotty that referenced this issue Sep 2, 2021
@som-snytt
Copy link
Contributor

som-snytt commented Sep 2, 2021

I haven't finished looking at the different calls to finishNamed but #13442

The token data of interest may not be this.

I can't tell if my baseball team is more likely to win if I'm watching or ignoring them.

Edit: it seems to work if I ignore them and do some coding, at least the Giants tied it up.

There is already an array of strings for keywords so it's nice to use it.

Edit: Giants gave up a run and now have an impossible task. Edit: they had a huge chance and can't get a run in.

griggt added a commit to griggt/dotty that referenced this issue Sep 2, 2021
griggt added a commit to griggt/dotty that referenced this issue Sep 2, 2021
nicolasstucki added a commit that referenced this issue Sep 3, 2021
Fix #13440: Avoid capturing var in message closure
@som-snytt
Copy link
Contributor

I didn't get a response to any comment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
4 participants