@@ -183,25 +183,27 @@ object RefChecks {
183183 def infoString0 (sym : Symbol , showLocation : Boolean ) = {
184184 val sym1 = sym.underlyingSymbol
185185 def info = self.memberInfo(sym1)
186- i " ${ if (showLocation) sym1.showLocated else sym1}${
186+ val infoStr =
187187 if (sym1.isAliasType) i " , which equals ${info.bounds.hi}"
188188 else if (sym1.isAbstractType) i " with bounds $info"
189189 else if (sym1.is(Module )) " "
190190 else if (sym1.isTerm) i " of type $info"
191191 else " "
192- } "
192+ i " ${ if (showLocation) sym1.showLocated else sym1}$infoStr "
193193 }
194194
195195 /* Check that all conditions for overriding `other` by `member`
196196 * of class `clazz` are met.
197197 */
198198 def checkOverride (member : Symbol , other : Symbol ): Unit = {
199- def memberTp = self.memberInfo(member)
200- def otherTp = self.memberInfo(other)
199+ def memberTp (self : Type ) =
200+ if (member.isClass) TypeAlias (member.typeRef.EtaExpand (member.typeParams))
201+ else self.memberInfo(member)
202+ def otherTp (self : Type ) = self.memberInfo(other)
201203
202204 ctx.debuglog(" Checking validity of %s overriding %s" .format(member.showLocated, other.showLocated))
203205
204- def noErrorType = ! memberTp.isErroneous && ! otherTp.isErroneous
206+ def noErrorType = ! memberTp(self) .isErroneous && ! otherTp(self) .isErroneous
205207
206208 def overrideErrorMsg (msg : String ): String = {
207209 val isConcreteOverAbstract =
@@ -212,10 +214,10 @@ object RefChecks {
212214 infoStringWithLocation(other),
213215 infoStringWithLocation(member))
214216 else if (ctx.settings.debug.value)
215- err.typeMismatchMsg(memberTp, otherTp)
217+ err.typeMismatchMsg(memberTp(self) , otherTp(self) )
216218 else " "
217219
218- " overriding %s;\n %s %s%s" .format(
220+ " error overriding %s;\n %s %s%s" .format(
219221 infoStringWithLocation(other), infoString(member), msg, addendum)
220222 }
221223
@@ -248,13 +250,16 @@ object RefChecks {
248250
249251 def compatibleTypes (memberTp : Type , otherTp : Type ): Boolean =
250252 try
251- if (member.isType) { // intersection of bounds to refined types must be nonempty
253+ if (member.isType) // intersection of bounds to refined types must be nonempty
252254 member.is(BaseTypeArg ) ||
253- (memberTp frozen_<:< otherTp) || {
254- val jointBounds = (memberTp.bounds & otherTp.bounds).bounds
255- jointBounds.lo frozen_<:< jointBounds.hi
256- }
257- }
255+ memberTp.bounds.hi.hasSameKindAs(otherTp.bounds.hi) &&
256+ ((memberTp frozen_<:< otherTp) ||
257+ ! member.owner.derivesFrom(other.owner) && {
258+ // if member and other come from independent classes or traits, their
259+ // bounds must have non-empty-intersection
260+ val jointBounds = (memberTp.bounds & otherTp.bounds).bounds
261+ jointBounds.lo frozen_<:< jointBounds.hi
262+ })
258263 else
259264 member.name.is(DefaultGetterName ) || // default getters are not checked for compatibility
260265 memberTp.overrides(otherTp,
@@ -367,9 +372,9 @@ object RefChecks {
367372 overrideError(" cannot be used here - term macros cannot override abstract methods" )
368373 } else if (other.is(Macro ) && ! member.is(Macro )) { // (1.10)
369374 overrideError(" cannot be used here - only term macros can override term macros" )
370- } else if (! compatibleTypes(memberTp, otherTp) &&
371- ! compatibleTypes(upwardsSelf.memberInfo(member ), upwardsSelf.memberInfo(other ))) {
372- overrideError(" has incompatible type" + err.whyNoMatchStr(memberTp, otherTp))
375+ } else if (! compatibleTypes(memberTp(self) , otherTp(self) ) &&
376+ ! compatibleTypes(memberTp(upwardsSelf ), otherTp(upwardsSelf ))) {
377+ overrideError(" has incompatible type" + err.whyNoMatchStr(memberTp(self) , otherTp(self) ))
373378 } else {
374379 checkOverrideDeprecated()
375380 }
0 commit comments