@@ -151,7 +151,8 @@ object RefChecks {
151
151
* before, but it looks too complicated and method bodies are far too large.
152
152
*/
153
153
private def checkAllOverrides (clazz : Symbol )(implicit ctx : Context ): Unit = {
154
- val self = upwardsThisType(clazz)
154
+ val self = clazz.thisType
155
+ val upwardsSelf = upwardsThisType(clazz)
155
156
var hasErrors = false
156
157
157
158
case class MixinOverrideError (member : Symbol , msg : String )
@@ -245,17 +246,24 @@ object RefChecks {
245
246
(if (otherAccess == " " ) " public" else " at least " + otherAccess))
246
247
}
247
248
248
- def compatibleTypes =
249
- if (member.isType) { // intersection of bounds to refined types must be nonempty
250
- member.is(BaseTypeArg ) ||
251
- (memberTp frozen_<:< otherTp) || {
252
- val jointBounds = (memberTp.bounds & otherTp.bounds).bounds
253
- jointBounds.lo frozen_<:< jointBounds.hi
249
+ def compatibleTypes (memberTp : Type , otherTp : Type ): Boolean =
250
+ try
251
+ if (member.isType) { // intersection of bounds to refined types must be nonempty
252
+ member.is(BaseTypeArg ) ||
253
+ (memberTp frozen_<:< otherTp) || {
254
+ val jointBounds = (memberTp.bounds & otherTp.bounds).bounds
255
+ jointBounds.lo frozen_<:< jointBounds.hi
256
+ }
254
257
}
258
+ else
259
+ member.name.is(DefaultGetterName ) || // default getters are not checked for compatibility
260
+ memberTp.overrides(otherTp)
261
+ catch {
262
+ case ex : MissingType =>
263
+ // can happen when called with upwardsSelf as qualifier of memberTp and otherTp,
264
+ // because in that case we might access types that are not members of the qualifier.
265
+ false
255
266
}
256
- else
257
- member.name.is(DefaultGetterName ) || // default getters are not checked for compatibility
258
- memberTp.overrides(otherTp)
259
267
260
268
// Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
261
269
@@ -356,7 +364,8 @@ object RefChecks {
356
364
overrideError(" cannot be used here - term macros cannot override abstract methods" )
357
365
} else if (other.is(Macro ) && ! member.is(Macro )) { // (1.10)
358
366
overrideError(" cannot be used here - only term macros can override term macros" )
359
- } else if (! compatibleTypes) {
367
+ } else if (! compatibleTypes(memberTp, otherTp) &&
368
+ ! compatibleTypes(upwardsSelf.memberInfo(member), upwardsSelf.memberInfo(other))) {
360
369
overrideError(" has incompatible type" + err.whyNoMatchStr(memberTp, otherTp))
361
370
} else {
362
371
checkOverrideDeprecated()
0 commit comments