@@ -791,37 +791,29 @@ object RefChecks {
791
791
val seenParents = mutable.HashSet [Type ]()
792
792
val baseClasses : List [ClassSymbol ] = clazz.info.baseClasses
793
793
794
- // tracks types that we have seen for a particular base class in baseClasses
795
- val seenTypes = MutableSymbolMap [List [ Type ] ](baseClasses.size)
794
+ // tracks the most specific type that we have seen for a particular base class
795
+ val seenTypes = MutableSymbolMap [Type ](baseClasses.size)
796
796
797
797
// validate all base types of a class in reverse linear order.
798
798
def register (tp : Type ): Unit = {
799
799
val baseClass = tp.classSymbol
800
800
if (baseClasses contains baseClass) {
801
- val alreadySeen = seenTypes.getOrElse(baseClass, Nil )
802
- if (alreadySeen.forall(tp1 => ! (tp1 <:< tp)))
803
- seenTypes.update(baseClass, tp :: alreadySeen.filter(tp1 => ! (tp <:< tp1)))
801
+ seenTypes.get(baseClass) match {
802
+ case Some (alreadySeen) if ! (tp <:< alreadySeen) =>
803
+ val msg =
804
+ em """ illegal inheritance;
805
+ |
806
+ | $clazz inherits different type instances of $baseClass:
807
+ | $tp and $alreadySeen"""
808
+ report.error(msg, clazz.srcPos)
809
+ case _ => seenTypes.update(baseClass, tp)
810
+ }
804
811
}
805
812
val remaining = tp.parents filterNot seenParents
806
813
seenParents ++= remaining
807
814
remaining foreach register
808
815
}
809
816
register(tpe)
810
-
811
- seenTypes.iterator.foreach {
812
- case (cls, Nil ) =>
813
- assert(false ) // this case should not be reachable
814
- case (cls, _ :: Nil ) =>
815
- () // Ok
816
- case (cls, tp1 :: tp2 :: _) =>
817
- val msg =
818
- em """ illegal inheritance;
819
- |
820
- | $clazz inherits different type instances of $cls:
821
- | $tp1 and $tp2"""
822
-
823
- report.error(msg, clazz.srcPos)
824
- }
825
817
}
826
818
827
819
checkParameterizedTraitsOK()
0 commit comments