Skip to content

Commit 8305ba7

Browse files
committed
Change overriding rule for erased values
erased can only override erased, non-erased can only override non-erased.
1 parent 69848fa commit 8305ba7

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ object RefChecks {
143143
* 1.8.1 M's type is a subtype of O's type, or
144144
* 1.8.2 M is of type []S, O is of type ()T and S <: T, or
145145
* 1.8.3 M is of type ()S, O is of type []T and S <: T, or
146-
* 1.9 If M is an erased def, O must be as well
147-
* 1.10 If `M` is a rewrite or Scala2x macro method, O cannot be deferred unless
146+
* 1.9 If M or O are erased, they must be both erased
147+
* 1.10 If M is a rewrite or Scala-2 macro method, O cannot be deferred unless
148148
* there's also a concrete method that M overrides.
149149
* 1.11. If O is a Scala-2 macro, M must be a Scala-2 macro.
150150
* 2. Check that only abstract classes have deferred members
@@ -379,6 +379,8 @@ object RefChecks {
379379
overrideError("must be declared lazy to override a lazy value")
380380
} else if (member.is(Erased) && !other.is(Erased)) { // (1.9)
381381
overrideError("is erased, cannot override non-erased member")
382+
} else if (other.is(Erased) && !member.is(Erased)) { // (1.9)
383+
overrideError("is not erased, cannot override erased member")
382384
} else if ((member.is(Rewrite) || member.is(Scala2Macro)) && other.is(Deferred) &&
383385
member.extendedOverriddenSymbols.forall(_.is(Deferred))) { // (1.10)
384386
overrideError("is a rewrite method, must override at least one concrete method")

0 commit comments

Comments
 (0)