scala/scala — pull request #3519 by adriaanm (2014-02-13 02:05:37+00:00)
Title: SI-8244 Fix raw type regression under separate compilation

[Rebase of #3483]

In #1901, handling of raw types encountered in signatures during class
file parsing was changed to work in the same manner as
`classExistentialType`, by using
`existentialAbstraction(cls.tparms, cls.tpe_*)`

But this never creates fresh existential symbols, and just sticks
the class type parameters it `quantified`:

scala> trait T[A <: String]
defined trait T

scala> val cls = typeOf[T[_]].typeSymbol
cls = trait T#101864

scala> cls.typeParams
res0 = List(type A#101865)

scala> cls.tpe_*
res1 = T#101864[A#101865]

scala> classExistentialType(cls)
res3 = T#101864[_ <: String#7209]

scala> val ExistentialType(quantified, result) = res3
List(type A#101865)

In the enclosed test case, this class type parameter was substituted
during `typeOf[X] memberType sym`, which led us unsoundly thinking
that `Raw[_]` was `Raw[X]`.

I've added a TODO comment to review the other usages of
`classExistentialType`.

Test variations include joint and separate compilation, and the
corresponding Scala-only code. All fail with type errors now,
as we expect. I've also added a distillation of a bootstrap
error that failed when I forgot to wrap the `existentialType`.