Skip to content

Commit b1273e1

Browse files
authored
Merge pull request scala#6843 from lrytz/t10853
Overriding pairs: consider redundant base classes by class, not by type
2 parents c7251ab + c895844 commit b1273e1

File tree

7 files changed

+38
-7
lines changed

7 files changed

+38
-7
lines changed

src/compiler/scala/tools/nsc/transform/Erasure.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ abstract class Erasure extends InfoTransform
472472
def computeAndEnter(): Unit = {
473473
while (opc.hasNext) {
474474
if (enteringExplicitOuter(!opc.low.isDeferred))
475-
checkPair(opc. currentPair)
475+
checkPair(opc.currentPair)
476476

477477
opc.next()
478478
}

src/library/scala/collection/immutable/Map.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ trait MapOps[K, +V, +CC[X, +Y] <: MapOps[X, Y, CC, _], +C <: MapOps[K, V, CC, C]
6161
def remove(key: K): C
6262

6363
/** Alias for `remove` */
64-
/* @`inline` final */ def - (key: K): C = remove(key)
64+
@deprecatedOverriding("This method should be final, but is not due to scala/bug#10853", "2.13.0")
65+
/*@`inline` final*/ def - (key: K): C = remove(key)
6566

6667
@deprecated("Use -- with an explicit collection", "2.13.0")
6768
def - (key1: K, key2: K, keys: K*): C = remove(key1).remove(key2).removeAll(keys)

src/library/scala/collection/immutable/Set.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ trait SetOps[A, +CC[X], +C <: SetOps[A, CC, C]]
4343
def excl(elem: A): C
4444

4545
/** Alias for `excl` */
46-
/* @`inline` final */ override def - (elem: A): C = excl(elem)
46+
@deprecatedOverriding("This method should be final, but is not due to scala/bug#10853", "2.13.0")
47+
/*@`inline` final*/ override def - (elem: A): C = excl(elem)
4748

4849
override def concat(that: collection.Iterable[A]): C = {
4950
var result: C = coll

src/library/scala/collection/mutable/Map.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ trait MapOps[K, V, +CC[X, Y] <: MapOps[X, Y, CC, _], +C <: MapOps[K, V, CC, C]]
5959
with Shrinkable[K] {
6060

6161
@deprecated("Use - or remove on an immutable Map", "2.13.0")
62-
/* final */ def - (key: K): C = clone() -= key
62+
@deprecatedOverriding("This method should be final, but is not due to scala/bug#10853", "2.13.0")
63+
/*final*/ def - (key: K): C = clone() -= key
6364

6465
@deprecated("Use -- or removeAll on an immutable Map", "2.13.0")
65-
/* final */ def - (key1: K, key2: K, keys: K*): C = clone() -= key1 -= key2 --= keys
66+
@deprecatedOverriding("This method should be final, but is not due to scala/bug#10853", "2.13.0")
67+
/*final*/ def - (key1: K, key2: K, keys: K*): C = clone() -= key1 -= key2 --= keys
6668

6769
/** Adds a new key/value pair to this map and optionally returns previously bound value.
6870
* If the map already contains a

src/reflect/scala/reflect/internal/SymbolPairs.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ abstract class SymbolPairs {
3535
* when viewed from IterableClass.
3636
*/
3737
def sameInBaseClass(baseClass: Symbol)(tp1: Type, tp2: Type) =
38-
(tp1 baseType baseClass) =:= (tp2 baseType baseClass)
38+
tp1.baseType(baseClass).typeSymbol == tp2.baseType(baseClass).typeSymbol
3939

4040
final case class SymbolPair(base: Symbol, low: Symbol, high: Symbol) {
4141
private[this] val self = base.thisType
@@ -125,7 +125,7 @@ abstract class SymbolPairs {
125125
* i = index(p)
126126
* j = index(b)
127127
* p isSubClass b
128-
* p.baseType(b) == self.baseType(b)
128+
* p.baseType(b).typeSymbol == self.baseType(b).typeSymbol
129129
*/
130130
private val subParents = new Array[BitSet](size)
131131

test/files/run/t10853.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
trait F[T1, R] { def apply(funArg: T1): R }
2+
3+
trait SetOps[A, +C] extends F[A, Boolean] { final def apply(setEl: A): Boolean = false }
4+
5+
class AbstractSet[A] extends SetOps[A, AbstractSet[A]]
6+
class AbstractSet2[A] extends AbstractSet[A] with SetOps[A, AbstractSet2[A]]
7+
8+
object Test {
9+
def main(args: Array[String]): Unit = {
10+
new AbstractSet2[String]
11+
}
12+
}

test/junit/scala/lang/traits/BytecodeTest.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,21 @@ class BytecodeTest extends BytecodeTesting {
2424
assertSameCode(f, List(VarOp(ALOAD, 0), Invoke(INVOKESTATIC, target, "f$", s"(L$target;)I", true), Op(IRETURN)))
2525
}
2626

27+
@Test
28+
def t10853(): Unit = {
29+
val code =
30+
"""trait F[T1, R] { def apply(funArg: T1): R }
31+
|
32+
|trait SetOps[A, +C] extends F[A, Boolean] { final def apply(setEl: A): Boolean = false }
33+
|
34+
|class AbstractSet[A] extends SetOps[A, AbstractSet[A]]
35+
|class AbstractSet2[A] extends AbstractSet[A] with SetOps[A, AbstractSet2[A]]
36+
""".stripMargin
37+
val cs = compileClasses(code)
38+
val c = cs.find(_.name == "AbstractSet2").get
39+
assertEquals(c.methods.asScala.map(_.name).toList, List("<init>")) // no bridge for apply (there's already one in AbstractSet)
40+
}
41+
2742
@Test
2843
def traitMethodForwarders(): Unit = {
2944
val code =

0 commit comments

Comments
 (0)