scala/scala — pull request #3025 by retronym (2013-10-09 11:31:10+00:00)
Title: 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