Skip to content

Commit 69c6500

Browse files
authored
Merge pull request scala#5331 from adriaanm/pr5282-reword
SD-128 fix override checks for default methods
2 parents 4b77734 + 3a3688f commit 69c6500

File tree

7 files changed

+49
-13
lines changed

7 files changed

+49
-13
lines changed

src/compiler/scala/tools/nsc/typechecker/RefChecks.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ abstract class RefChecks extends Transform {
419419
overrideError("cannot be used here - classes can only override abstract types")
420420
} else if (other.isEffectivelyFinal) { // (1.2)
421421
overrideError("cannot override final member")
422-
} else if (!other.isDeferredOrJavaDefault && !other.hasFlag(JAVA_DEFAULTMETHOD) && !member.isAnyOverride && !member.isSynthetic) { // (*)
422+
} else if (!other.isDeferred && !member.isAnyOverride && !member.isSynthetic) { // (*)
423423
// (*) Synthetic exclusion for (at least) default getters, fixes SI-5178. We cannot assign the OVERRIDE flag to
424424
// the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket.
425425
if (isNeitherInClass && !(other.owner isSubClass member.owner))
@@ -606,7 +606,7 @@ abstract class RefChecks extends Transform {
606606
def checkNoAbstractMembers(): Unit = {
607607
// Avoid spurious duplicates: first gather any missing members.
608608
def memberList = clazz.info.nonPrivateMembersAdmitting(VBRIDGE)
609-
val (missing, rest) = memberList partition (m => m.isDeferredNotJavaDefault && !ignoreDeferred(m))
609+
val (missing, rest) = memberList partition (m => m.isDeferred && !ignoreDeferred(m))
610610
// Group missing members by the name of the underlying symbol,
611611
// to consolidate getters and setters.
612612
val grouped = missing groupBy (sym => analyzer.underlyingSymbol(sym).name)

src/library/scala/collection/convert/Wrappers.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private[collection] trait Wrappers {
2828
def next() = underlying.next()
2929
def hasMoreElements = underlying.hasNext
3030
def nextElement() = underlying.next()
31-
def remove() = throw new UnsupportedOperationException
31+
override def remove() = throw new UnsupportedOperationException
3232
}
3333

3434
class ToIteratorWrapper[A](underlying : Iterator[A]) {
@@ -113,7 +113,7 @@ private[collection] trait Wrappers {
113113
var prev: Option[A] = None
114114
def hasNext = ui.hasNext
115115
def next = { val e = ui.next(); prev = Some(e); e }
116-
def remove = prev match {
116+
override def remove() = prev match {
117117
case Some(e) =>
118118
underlying match {
119119
case ms: mutable.Set[a] =>
@@ -200,7 +200,7 @@ private[collection] trait Wrappers {
200200
}
201201
}
202202

203-
def remove() {
203+
override def remove() {
204204
prev match {
205205
case Some(k) =>
206206
underlying match {
@@ -293,24 +293,24 @@ private[collection] trait Wrappers {
293293

294294
class ConcurrentMapWrapper[A, B](override val underlying: concurrent.Map[A, B]) extends MutableMapWrapper[A, B](underlying) with juc.ConcurrentMap[A, B] {
295295

296-
def putIfAbsent(k: A, v: B) = underlying.putIfAbsent(k, v) match {
296+
override def putIfAbsent(k: A, v: B) = underlying.putIfAbsent(k, v) match {
297297
case Some(v) => v
298298
case None => null.asInstanceOf[B]
299299
}
300300

301-
def remove(k: AnyRef, v: AnyRef) = try {
301+
override def remove(k: AnyRef, v: AnyRef) = try {
302302
underlying.remove(k.asInstanceOf[A], v.asInstanceOf[B])
303303
} catch {
304304
case ex: ClassCastException =>
305305
false
306306
}
307307

308-
def replace(k: A, v: B): B = underlying.replace(k, v) match {
308+
override def replace(k: A, v: B): B = underlying.replace(k, v) match {
309309
case Some(v) => v
310310
case None => null.asInstanceOf[B]
311311
}
312312

313-
def replace(k: A, oldval: B, newval: B) = underlying.replace(k, oldval, newval)
313+
override def replace(k: A, oldval: B, newval: B) = underlying.replace(k, oldval, newval)
314314
}
315315

316316
/** Wraps a concurrent Java map as a Scala one. Single-element concurrent

src/reflect/scala/reflect/internal/Definitions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ trait Definitions extends api.StandardDefinitions {
855855
// must filter out "universal" members (getClass is deferred for some reason)
856856
val deferredMembers = (
857857
tp.membersBasedOnFlags(excludedFlags = BridgeAndPrivateFlags, requiredFlags = METHOD).toList.filter(
858-
mem => mem.isDeferredNotJavaDefault && !isUniversalMember(mem)
858+
mem => mem.isDeferred && !isUniversalMember(mem)
859859
) // TODO: test
860860
)
861861

src/reflect/scala/reflect/internal/HasFlags.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,6 @@ trait HasFlags {
122122
def isTrait = hasFlag(TRAIT) && !hasFlag(PARAM)
123123
def isTraitOrInterface = isTrait || isInterface
124124

125-
def isDeferredOrJavaDefault = hasFlag(DEFERRED | JAVA_DEFAULTMETHOD)
126-
def isDeferredNotJavaDefault = isDeferred && !hasFlag(JAVA_DEFAULTMETHOD)
127-
128125
def flagBitsToString(bits: Long): String = {
129126
// Fast path for common case
130127
if (bits == 0L) "" else {

test/files/neg/sd128.check

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
Test.scala:4: error: class C1 inherits conflicting members:
2+
method f in trait A of type ()Int and
3+
method f in trait T of type => Int
4+
(Note: this can be resolved by declaring an override in class C1.)
5+
class C1 extends A with T // error
6+
^
7+
Test.scala:5: error: class C2 inherits conflicting members:
8+
method f in trait T of type => Int and
9+
method f in trait A of type ()Int
10+
(Note: this can be resolved by declaring an override in class C2.)
11+
class C2 extends T with A // error
12+
^
13+
Test.scala:14: error: overriding method f in trait A of type ()Int;
14+
method f needs `override' modifier
15+
def f() = 9999 // need override modifier
16+
^
17+
three errors found

test/files/neg/sd128/A.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface A {
2+
default int f() { return -10; }
3+
}

test/files/neg/sd128/Test.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
trait T {
2+
def f = 99
3+
}
4+
class C1 extends A with T // error
5+
class C2 extends T with A // error
6+
7+
trait U extends A {
8+
override def f = 999
9+
}
10+
class D1 extends A with U // OK
11+
class D2 extends U with A // OK
12+
13+
class E1 extends A {
14+
def f() = 9999 // need override modifier
15+
}
16+
17+
class E2 extends A {
18+
override def f() = 9999 // OK
19+
}

0 commit comments

Comments
 (0)