Skip to content

Commit f000afe

Browse files
authored
Merge pull request #9187 from FabioPinheiro/override_check_order
Change order of override error checks
2 parents f032a88 + 6beb516 commit f000afe

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

compiler/src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,10 @@ object RefChecks {
143143
*
144144
* 1.1. M must have the same or stronger access privileges as O.
145145
* 1.2. O must not be effectively final.
146-
* 1.3. O is deferred, or M has `override` modifier.
147-
* 1.4. If O is stable, then so is M.
148-
* // @M: LIFTED 1.5. Neither M nor O are a parameterized type alias
146+
* 1.3. If M or O are extension methods, they must both be extension methods.
147+
* (Should be before the check for the need of `override` modifier.)
148+
* 1.4. O is deferred, or M has `override` modifier.
149+
* 1.5. If O is stable, then so is M.
149150
* 1.6. If O is a type alias, then M is an alias of O.
150151
* 1.7. If O is an abstract type then
151152
* 1.7.1 either M is an abstract type, and M's bounds are sharper than O's bounds.
@@ -156,8 +157,7 @@ object RefChecks {
156157
* 1.8.1 M's type is a subtype of O's type, or
157158
* 1.8.2 M is of type []S, O is of type ()T and S <: T, or
158159
* 1.8.3 M is of type ()S, O is of type []T and S <: T, or
159-
* 1.9.1 If M is erased, O is erased. If O is erased, M is erased or inline.
160-
* 1.9.2 If M or O are extension methods, they must both be extension methods.
160+
* 1.9. If M is erased, O is erased. If O is erased, M is erased or inline.
161161
* 1.10. If O is inline (and deferred, otherwise O would be final), M must be inline
162162
* 1.11. If O is a Scala-2 macro, M must be a Scala-2 macro.
163163
* 2. Check that only abstract classes have deferred members
@@ -343,6 +343,10 @@ object RefChecks {
343343
overrideError("cannot be used here - classes can only override abstract types")
344344
else if (other.isEffectivelyFinal) // (1.2)
345345
overrideError(i"cannot override final member ${other.showLocated}")
346+
else if (member.isAllOf(ExtensionMethod) && !other.isAllOf(ExtensionMethod)) // (1.3)
347+
overrideError("is an extension method, cannot override a normal method")
348+
else if (other.isAllOf(ExtensionMethod) && !member.isAllOf(ExtensionMethod)) // (1.3)
349+
overrideError("is a normal method, cannot override an extension method")
346350
else if (!other.is(Deferred) &&
347351
!other.name.is(DefaultGetterName) &&
348352
!member.isAnyOverride)
@@ -381,7 +385,7 @@ object RefChecks {
381385
intersectionIsEmpty(member.extendedOverriddenSymbols, other.extendedOverriddenSymbols))
382386
overrideError("cannot override a concrete member without a third member that's overridden by both " +
383387
"(this rule is designed to prevent ``accidental overrides'')")
384-
else if (other.isStableMember && !member.isStableMember) // (1.4)
388+
else if (other.isStableMember && !member.isStableMember) // (1.5)
385389
overrideError("needs to be a stable, immutable value")
386390
else if (member.is(ModuleVal) && !other.isRealMethod && !other.isOneOf(Deferred | Lazy))
387391
overrideError("may not override a concrete non-lazy value")
@@ -390,14 +394,10 @@ object RefChecks {
390394
overrideError("may not override a non-lazy value")
391395
else if (other.is(Lazy) && !other.isRealMethod && !member.is(Lazy))
392396
overrideError("must be declared lazy to override a lazy value")
393-
else if (member.is(Erased) && !other.is(Erased)) // (1.9.1)
397+
else if (member.is(Erased) && !other.is(Erased)) // (1.9)
394398
overrideError("is erased, cannot override non-erased member")
395-
else if (other.is(Erased) && !member.isOneOf(Erased | Inline)) // (1.9.1)
399+
else if (other.is(Erased) && !member.isOneOf(Erased | Inline)) // (1.9)
396400
overrideError("is not erased, cannot override erased member")
397-
else if (member.isAllOf(ExtensionMethod) && !other.isAllOf(ExtensionMethod)) // (1.9.2)
398-
overrideError("is an extension method, cannot override a normal method")
399-
else if (other.isAllOf(ExtensionMethod) && !member.isAllOf(ExtensionMethod)) // (1.9.2)
400-
overrideError("is a normal method, cannot override an extension method")
401401
else if other.is(Inline) && !member.is(Inline) then // (1.10)
402402
overrideError("is not inline, cannot implement an inline method")
403403
else if (other.isScala2Macro && !member.isScala2Macro) // (1.11)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-- Error: tests/neg/override-extension_normal-methods.scala:6:6 --------------------------------------------------------
2+
6 | def m[T](x: T): String = "normal method" // error: normal method, cannot override an extension method. Also needs `override' modifier (but this error should be obfuscated).
3+
| ^
4+
| error overriding method m in trait A of type [T](t: T): String;
5+
| method m of type [T](x: T): String is a normal method, cannot override an extension method
6+
-- Error: tests/neg/override-extension_normal-methods.scala:14:6 -------------------------------------------------------
7+
14 | def [T](t: T).m: String = "extrnsion method" // error: extension method, cannot override an normal method. Also needs `override' modifier (but this error should be obfuscated).
8+
| ^
9+
| error overriding method m in trait B of type [T](x: T): String;
10+
| method m of type [T](t: T): String is an extension method, cannot override a normal method
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
trait A {
2+
def [T](t: T).m: String = "extrnsion method"
3+
}
4+
5+
trait AAA extends A {
6+
def m[T](x: T): String = "normal method" // error: normal method, cannot override an extension method. Also needs `override' modifier (but this error should be obfuscated).
7+
}
8+
9+
trait B {
10+
def m[T](x: T): String = "normal method"
11+
}
12+
13+
trait BBB extends B {
14+
def [T](t: T).m: String = "extrnsion method" // error: extension method, cannot override an normal method. Also needs `override' modifier (but this error should be obfuscated).
15+
}

0 commit comments

Comments
 (0)