scala/scala — pull request #3491 by retronym (2014-02-09 08:29:45+00:00)
Title: [backport] SI-7902 Fix spurious kind error due to an unitialized symbol

Tracked down this error:

is invariant, but type Y2 is declared covariant
's bounds are stricter than type X2's declared bounds >: Nothing <: Any, 's bounds are stricter than type Y2's declared bounds >: Nothing <: Any

to `Symbol#typeParams` returning `List(NoSymbol)` if the symbol
was not initialized.

This happends in the enclosed test for:

// checkKindBoundsHK()
hkArgs = List(type M3)
hkParams = List(type M2)

This commit forces the symbol of the higher-kinded type argument
before checking kind conformance.

A little backstory:

The `List(NoSymbol)` arises from:

class PolyTypeCompleter... {
// @M. If `owner` is an abstract type member, `typeParams` are all NoSymbol (see comment in `completerOf`),
// otherwise, the non-skolemized (external) type parameter symbols
override val typeParams = tparams map (_.symbol)

The variation that triggers this problem gets into the kind
conformance checks quite early on, during naming of:

private[this] val x = ofType[InSeq]

The inferred type of which is forced during:

def addDerivedTrees(typer: Typer, stat: Tree): List[Tree] = stat match {
case vd @ ValDef(mods, name, tpt, rhs) if !noFinishGetterSetter(vd) =>
// If we don't save the annotations, they seem to wander off.
val annotations = stat.symbol.initialize.annotations

(cherry picked from commit 03a06e02483eaf442158339c2edd6bcfd99847a3)

Review by @gkossakowski. This problem hit some more people yesterday.
The fix in master has had four months of battle testing, I think its
suitable for the backport for RC3.