diff options
author | odersky <odersky@gmail.com> | 2015-08-22 17:39:16 +0200 |
---|---|---|
committer | odersky <odersky@gmail.com> | 2015-08-22 17:39:16 +0200 |
commit | de9877f53ef4e0c94968475788dd2c9e120c6e8d (patch) | |
tree | f753793a6a4b32862123892b2c0bed0a6b574b46 | |
parent | 54d691e336a7a3e60d40eadab40bee9a48126f69 (diff) | |
parent | d17d3121fd8cbd620bbc70bb46e983b37311ba15 (diff) | |
download | dotty-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.scala | 6 | ||||
-rw-r--r-- | tests/run/i764.scala | 14 |
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 + } +} |