Scalaコンパイラを落とす3行のコード

既知のバグ(NullPointerException when using case class with function-valued field · Issue #1087 · scala/bug · GitHub)だったようです。
Scalaコンパイラを落とすコード。

class A
case class B extends A
case class C(f : Unit => Unit)  extends B
$ scalac foo.java
...
Exception in thread "main" java.lang.NullPointerException
        at scala.tools.nsc.typechecker.EtaExpansion$class.freshName$1(EtaExpansion.scala:57)
        at scala.tools.nsc.typechecker.EtaExpansion$class.liftout$1(EtaExpansion.scala:82)
        at scala.tools.nsc.typechecker.EtaExpansion$class.liftoutPrefix$1(EtaExpansion.scala:92)
        at scala.tools.nsc.typechecker.EtaExpansion$class.etaExpand(EtaExpansion.scala:121)
        at scala.tools.nsc.Global$analyzer$.etaExpand(Global.scala:284)
...

発生条件

caseクラスを継承できるのかな、と思って試してみたら、コンパイラNullPointerExceptionを吐いた。型チェックに失敗しているのか。

いろいろコードを変えて試したところ、

  • caseクラスを継承する
  • 引数として関数型を受け取る

という条件で落ちる気がする。

発生環境

環境は、こんな感じ。

$ uname -a
Linux mzp-desktop 2.6.27-11-generic #1 SMP Thu Jan 29 19:24:39 UTC 2009 i686 GNU/Linux

$ java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)

$ scalac -version
Scala compiler version 2.7.2.final -- Copyright 2002-2008, LAMP/EPFL