Aladdin - Scala Bugtracking
[#423] project: compiler priority: high category: bug
submitter assigned to status date submitted
Michel Martin fixed 2005-04-24 12:48:53.0
subject Wrong handling of sequence parameters
code
object Bug {
  def f[T <: AnyRef](elems: T*): Unit =
    g(Predef.Array(elems : _*));

  def g[T <: AnyRef](x: Array[T]): Unit = ();

  def main(args: Array[String]): Unit = {
    f("a","b")
  }
}
what happened
Exception in thread "main" java.lang.ClassCastException
	at Bug$.f(bug-uncurry.scala:3)
	at Bug$.main(bug-uncurry.scala:8)
	at Bug.main(bug-uncurry.scala:7)
what expected A working program. The problem turns out to be due to a strange transformation performed by UnCurry. Before it, the "f" function looks like:
  final def f[T <: java.lang.Object](elems: scala.Seq[T]): scala.Unit =
    Bug.this.g[T](scala.Predef.Array[T]((elems) : _*));
and after it:
  final def f[T <: java.lang.Object](elems: scala.Seq[T]): scala.Unit =
    Bug.this.g[T]({
      scala.Predef;
      elems
    });
which is wrong, as elems is, I believe, a List and not an Array.
[back to overview]
Changes of this bug report
Burak  edited on  2005-05-25 18:31:39.0

The transformation is indeed strange, and maybe it should be in a phase of its own.

Usually, Predef.Array(x0,...,xN) would be translated to an array, but for sequence-escaped parameter elems:_* nothing happens.

If the Sequence x0,...,xN is translated to an array, one must remove the Predef.Array around it. Of course, for sequence-escaped parameters, it must stay as it is.

Burak  edited on  2005-05-25 18:32:40.0
So the result after UnCurry looks like this, as it should.
  final def f[final T <: java.lang.Object](final elems: scala.Seq[T]): scala.Unit = Bug.this.g[T](scala.Predef.Array[T](elems));