Dotty: Crash in REPL when for-case is used

Created on 27 Jan 2020  路  1Comment  路  Source: lampepfl/dotty

Minimized code

A crash occurs when the following code is _the first line_ entered into the REPL:

scala> for case Some(i) <- Option(0).filter(_ != 1) yield i
Exception in thread "main" java.lang.NullPointerException


Stack trace

Exception in thread "main" java.lang.NullPointerException
    at dotty.tools.dotc.core.NameKinds$UniqueNameKind.fresh(NameKinds.scala:218)
    at dotty.tools.dotc.parsing.Parsers$Parser.simpleExpr(Parsers.scala:2202)
    at dotty.tools.dotc.parsing.Parsers$Parser.$init$$$anonfun$7(Parsers.scala:2169)
    at dotty.tools.dotc.parsing.Parsers$Parser.postfixExpr(Parsers.scala:2153)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr1(Parsers.scala:2014)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr(Parsers.scala:1888)
    at dotty.tools.dotc.parsing.Parsers$Parser.$init$$$anonfun$5(Parsers.scala:1867)
    at dotty.tools.dotc.parsing.Parsers$Parser.$init$$$anonfun$8(Parsers.scala:2320)
    at dotty.tools.dotc.parsing.Parsers$Parser.tokenSeparated(Parsers.scala:601)
    at dotty.tools.dotc.parsing.Parsers$Parser.commaSeparated(Parsers.scala:609)
    at dotty.tools.dotc.parsing.Parsers$Parser.parArgumentExprs$$anonfun$1(Parsers.scala:2306)
    at dotty.tools.dotc.parsing.Parsers$Parser.enclosed(Parsers.scala:569)
    at dotty.tools.dotc.parsing.Parsers$Parser.inParens(Parsers.scala:576)
    at dotty.tools.dotc.parsing.Parsers$Parser.parArgumentExprs(Parsers.scala:2307)
    at dotty.tools.dotc.parsing.Parsers$Parser.argumentExprs(Parsers.scala:2313)
    at dotty.tools.dotc.parsing.Parsers$Parser.simpleExprRest(Parsers.scala:2261)
    at dotty.tools.dotc.parsing.Parsers$Parser.simpleExprRest(Parsers.scala:2254)
    at dotty.tools.dotc.parsing.Parsers$Parser.simpleExprRest(Parsers.scala:2262)
    at dotty.tools.dotc.parsing.Parsers$Parser.simpleExpr(Parsers.scala:2246)
    at dotty.tools.dotc.parsing.Parsers$Parser.$init$$$anonfun$7(Parsers.scala:2169)
    at dotty.tools.dotc.parsing.Parsers$Parser.postfixExpr(Parsers.scala:2153)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr1(Parsers.scala:2014)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr(Parsers.scala:1888)
    at dotty.tools.dotc.parsing.Parsers$Parser.$init$$$anonfun$6(Parsers.scala:1869)
    at dotty.tools.dotc.parsing.Parsers$Parser.subPart(Parsers.scala:646)
    at dotty.tools.dotc.parsing.Parsers$Parser.subExpr(Parsers.scala:1871)
    at dotty.tools.dotc.parsing.Parsers$Parser.generatorRest(Parsers.scala:2443)
    at dotty.tools.dotc.parsing.Parsers$Parser.generator(Parsers.scala:2434)
    at dotty.tools.dotc.parsing.Parsers$Parser.enumerators(Parsers.scala:2405)
    at dotty.tools.dotc.parsing.Parsers$Parser.$anonfun$39(Parsers.scala:2499)
    at dotty.tools.dotc.parsing.Parsers$Parser.inSepRegion(Parsers.scala:613)
    at dotty.tools.dotc.parsing.Parsers$Parser.forExpr$$anonfun$1(Parsers.scala:2499)
    at dotty.tools.dotc.parsing.Scanners$Scanner.endMarkerScope(Scanners.scala:338)
    at dotty.tools.dotc.parsing.Parsers$Parser.forExpr(Parsers.scala:2527)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr1(Parsers.scala:1984)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr(Parsers.scala:1888)
    at dotty.tools.dotc.parsing.Parsers$Parser.blockStatSeq$$anonfun$1(Parsers.scala:3888)
    at dotty.tools.dotc.parsing.Parsers$Parser.checkNoEscapingPlaceholders(Parsers.scala:510)
    at dotty.tools.dotc.parsing.Parsers$Parser.blockStatSeq(Parsers.scala:3900)
    at dotty.tools.dotc.parsing.Parsers$Parser.block(Parsers.scala:2378)
    at dotty.tools.dotc.parsing.Parsers$Parser.blockExpr$$anonfun$1(Parsers.scala:2370)
    at dotty.tools.dotc.parsing.Parsers$Parser.enclosed(Parsers.scala:569)
    at dotty.tools.dotc.parsing.Parsers$Parser.inBraces(Parsers.scala:577)
    at dotty.tools.dotc.parsing.Parsers$Parser.inBracesOrIndented(Parsers.scala:590)
    at dotty.tools.dotc.parsing.Parsers$Parser.inDefScopeBraces(Parsers.scala:594)
    at dotty.tools.dotc.parsing.Parsers$Parser.blockExpr(Parsers.scala:2371)
    at dotty.tools.dotc.parsing.Parsers$Parser.simpleExpr(Parsers.scala:2211)
    at dotty.tools.dotc.parsing.Parsers$Parser.$init$$$anonfun$7(Parsers.scala:2169)
    at dotty.tools.dotc.parsing.Parsers$Parser.postfixExpr(Parsers.scala:2153)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr1(Parsers.scala:2014)
    at dotty.tools.dotc.parsing.Parsers$Parser.expr(Parsers.scala:1888)
    at dotty.tools.dotc.parsing.Parsers$Parser.blockStatSeq$$anonfun$1(Parsers.scala:3888)
    at dotty.tools.dotc.parsing.Parsers$Parser.checkNoEscapingPlaceholders(Parsers.scala:510)
    at dotty.tools.dotc.parsing.Parsers$Parser.blockStatSeq(Parsers.scala:3900)
    at dotty.tools.repl.ParseResult$.parseStats(ParseResult.scala:113)
    at dotty.tools.repl.ParseResult$.isIncomplete$$anonfun$2(ParseResult.scala:165)
    at dotty.tools.dotc.reporting.Reporter.withIncompleteHandler(Reporter.scala:221)
    at dotty.tools.repl.ParseResult$.isIncomplete(ParseResult.scala:166)
    at dotty.tools.repl.JLineTerminal$Parser.acceptLine$1(JLineTerminal.scala:130)
    at dotty.tools.repl.JLineTerminal$Parser.parse(JLineTerminal.scala:134)
    at org.jline.reader.impl.LineReaderImpl.acceptLine(LineReaderImpl.java:2731)
    at org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:585)
    at org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:404)
    at dotty.tools.repl.JLineTerminal.readLine(JLineTerminal.scala:68)
    at dotty.tools.repl.ReplDriver.readLine$1(ReplDriver.scala:115)
    at dotty.tools.repl.ReplDriver.loop$1(ReplDriver.scala:125)
    at dotty.tools.repl.ReplDriver.runUntilQuit$$anonfun$1(ReplDriver.scala:130)
    at dotty.tools.repl.ReplDriver.withRedirectedOutput(ReplDriver.scala:148)
    at dotty.tools.repl.ReplDriver.runUntilQuit(ReplDriver.scala:130)
    at dotty.tools.repl.Main$.main(Main.scala:6)
    at dotty.tools.repl.Main.main(Main.scala)

The same crash occurs with multi-line editing as follows:

scala> for
     |   case Some(i) <- Option(0).filter(_ != 1)
Exception in thread "main" java.lang.NullPointerException

As far as I can tell, entering a single line beforehand stops the crash from happening:

scala> 5
val res0: Int = 5

scala> for case Some(i) <- Option(0).filter(_ != 1) yield i
1 |for case Some(i) <- Option(0).filter(_ != 1) yield i
  |         ^^^^^^^
  |         cannot test if value types are references

scala> 
bug crash

Most helpful comment

Sounds like a duplicate of #7934

>All comments

Sounds like a duplicate of #7934

Was this page helpful?
0 / 5 - 0 ratings