aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/transform/MixinOps.scala6
-rw-r--r--tests/run/i764.scala14
2 files changed, 18 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/transform/MixinOps.scala b/src/dotty/tools/dotc/transform/MixinOps.scala
index 3685a00fc..f56c83f96 100644
--- a/src/dotty/tools/dotc/transform/MixinOps.scala
+++ b/src/dotty/tools/dotc/transform/MixinOps.scala
@@ -38,10 +38,12 @@ class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx:
def isCurrent(sym: Symbol) = cls.info.member(sym.name).hasAltWith(_.symbol == sym)
def needsForwarder(meth: Symbol): Boolean = {
- def needsDisambiguation = !meth.allOverriddenSymbols.forall(_ is Deferred)
+ lazy val overridenSymbols = meth.allOverriddenSymbols
+ def needsDisambiguation = !overridenSymbols.forall(_ is Deferred)
+ def hasNonInterfaceDefinition = overridenSymbols.forall(!_.owner.is(Trait))
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
isCurrent(meth) &&
- (needsDisambiguation || meth.owner.is(Scala2x))
+ (needsDisambiguation || hasNonInterfaceDefinition || meth.owner.is(Scala2x))
}
final val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred
diff --git a/tests/run/i764.scala b/tests/run/i764.scala
new file mode 100644
index 000000000..921bdd23b
--- /dev/null
+++ b/tests/run/i764.scala
@@ -0,0 +1,14 @@
+abstract class A {
+ def foo: Int
+}
+
+trait B {
+ def foo = 2
+}
+
+object Test extends A with B {
+
+ def main(args: Array[String]): Unit = {
+ this.foo
+ }
+}