aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2015-08-22 17:39:16 +0200
committerodersky <odersky@gmail.com>2015-08-22 17:39:16 +0200
commitde9877f53ef4e0c94968475788dd2c9e120c6e8d (patch)
treef753793a6a4b32862123892b2c0bed0a6b574b46
parent54d691e336a7a3e60d40eadab40bee9a48126f69 (diff)
parentd17d3121fd8cbd620bbc70bb46e983b37311ba15 (diff)
downloaddotty-de9877f53ef4e0c94968475788dd2c9e120c6e8d.tar.gz
dotty-de9877f53ef4e0c94968475788dd2c9e120c6e8d.tar.bz2
dotty-de9877f53ef4e0c94968475788dd2c9e120c6e8d.zip
Merge pull request #764 from dotty-staging/mixin/forwarders
Mixin: class defined abstract members take precedence over interface defined.
-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
+ }
+}