Skip to content

Commit de9877f

Browse files
committed
Merge pull request #764 from dotty-staging/mixin/forwarders
Mixin: class defined abstract members take precedence over interface defined.
2 parents 54d691e + d17d312 commit de9877f

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

src/dotty/tools/dotc/transform/MixinOps.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx:
3838
def isCurrent(sym: Symbol) = cls.info.member(sym.name).hasAltWith(_.symbol == sym)
3939

4040
def needsForwarder(meth: Symbol): Boolean = {
41-
def needsDisambiguation = !meth.allOverriddenSymbols.forall(_ is Deferred)
41+
lazy val overridenSymbols = meth.allOverriddenSymbols
42+
def needsDisambiguation = !overridenSymbols.forall(_ is Deferred)
43+
def hasNonInterfaceDefinition = overridenSymbols.forall(!_.owner.is(Trait))
4244
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
4345
isCurrent(meth) &&
44-
(needsDisambiguation || meth.owner.is(Scala2x))
46+
(needsDisambiguation || hasNonInterfaceDefinition || meth.owner.is(Scala2x))
4547
}
4648

4749
final val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred

tests/run/i764.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
abstract class A {
2+
def foo: Int
3+
}
4+
5+
trait B {
6+
def foo = 2
7+
}
8+
9+
object Test extends A with B {
10+
11+
def main(args: Array[String]): Unit = {
12+
this.foo
13+
}
14+
}

0 commit comments

Comments
 (0)