@@ -183,25 +183,27 @@ object RefChecks {
183
183
def infoString0 (sym : Symbol , showLocation : Boolean ) = {
184
184
val sym1 = sym.underlyingSymbol
185
185
def info = self.memberInfo(sym1)
186
- i " ${ if (showLocation) sym1.showLocated else sym1}${
186
+ val infoStr =
187
187
if (sym1.isAliasType) i " , which equals ${info.bounds.hi}"
188
188
else if (sym1.isAbstractType) i " with bounds $info"
189
189
else if (sym1.is(Module )) " "
190
190
else if (sym1.isTerm) i " of type $info"
191
191
else " "
192
- } "
192
+ i " ${ if (showLocation) sym1.showLocated else sym1}$infoStr "
193
193
}
194
194
195
195
/* Check that all conditions for overriding `other` by `member`
196
196
* of class `clazz` are met.
197
197
*/
198
198
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)
201
203
202
204
ctx.debuglog(" Checking validity of %s overriding %s" .format(member.showLocated, other.showLocated))
203
205
204
- def noErrorType = ! memberTp.isErroneous && ! otherTp.isErroneous
206
+ def noErrorType = ! memberTp(self) .isErroneous && ! otherTp(self) .isErroneous
205
207
206
208
def overrideErrorMsg (msg : String ): String = {
207
209
val isConcreteOverAbstract =
@@ -212,10 +214,10 @@ object RefChecks {
212
214
infoStringWithLocation(other),
213
215
infoStringWithLocation(member))
214
216
else if (ctx.settings.debug.value)
215
- err.typeMismatchMsg(memberTp, otherTp)
217
+ err.typeMismatchMsg(memberTp(self) , otherTp(self) )
216
218
else " "
217
219
218
- " overriding %s;\n %s %s%s" .format(
220
+ " error overriding %s;\n %s %s%s" .format(
219
221
infoStringWithLocation(other), infoString(member), msg, addendum)
220
222
}
221
223
@@ -248,13 +250,16 @@ object RefChecks {
248
250
249
251
def compatibleTypes (memberTp : Type , otherTp : Type ): Boolean =
250
252
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
252
254
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
+ })
258
263
else
259
264
member.name.is(DefaultGetterName ) || // default getters are not checked for compatibility
260
265
memberTp.overrides(otherTp,
@@ -367,9 +372,9 @@ object RefChecks {
367
372
overrideError(" cannot be used here - term macros cannot override abstract methods" )
368
373
} else if (other.is(Macro ) && ! member.is(Macro )) { // (1.10)
369
374
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) ))
373
378
} else {
374
379
checkOverrideDeprecated()
375
380
}
0 commit comments