Aladdin - Scala Bugtracking
[#691] project: compiler priority: low category: bug
submitter assigned to status date submitted
Sean Martin fixed 2006-08-06 16:33:03.0
subject super selector broken in twisty mixin composition
code
trait Base {
  trait AssignArrow {
    type T <: Ti;
    trait Ti;
  }
  abstract class Arrow extends AssignArrow;
  val arrow : Arrow;
}

trait Ext0 extends Base {
  trait AssignArrow extends super.AssignArrow {
    type T <: Ti;
    trait Ti extends super.Ti;
  }
}
trait Ext1 extends Base {
  trait Arrow extends super.Arrow {
    type T <: Ti;
    trait Ti extends super.Ti;
    trait TiXX extends Ti;
  }
  val arrow : Arrow;
}
trait Composition extends Ext0 with Ext1 {
  object arrow0 extends Arrow with AssignArrow {
    type T = Ti /* with TiXX */;
    trait Ti extends super[Arrow].Ti with super[AssignArrow].Ti;
  }
}
what happened
error overriding type T in trait Arrow with bounds >: scala.All <: arrow0.this.Ti;
type T has incompatible type	test2/src/test	test.scala	line 30	1154812245171	34629
what expected No type error. I think super[Arrow].Ti is resolving to Base#Arrow#Ti rather than Ext1#Arrow#Ti (the symbol provided to the presentation compiler backs this up). Note that if we uncomment the /* with TiXX */ the type error goes away because TiXX allows us to get at Ext1#Arrow#Ti.
[back to overview]
Changes of this bug report
Martin  edited on  2006-08-22 16:37:33.0
This was hard to figure out. The problem is that Ext1.Arrow is a trait, whose superclass is Base.Arrow. Furthermore, the extends caluse of arrow0 starts with trait Ext1.Arrow, and is therefore implicitly augmented with a superclass. The augmented signature of arrow0 reads:
object arrow0 extends Base#Arrow with Ext1#Arrow with ...
Hence, in object arrow0 the reference super[Arrow] really referred to Base#Arrow, because the spec said that the *first* parent class with the given name would be picked. To prevent mystifing behavior like this, I changed spec and compiler so that only a single parent class may have the given name, otherwise an ambiguity error results.