Skip to content

Commit ee5639a

Browse files
committed
Mixin: class defined abstract members take precedence over interface defined.
In case we have an class-defined abstract member implemented by a trait we need to create an explicit forwarder.
1 parent eec8191 commit ee5639a

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-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

0 commit comments

Comments
 (0)