diff options
author | Martin Odersky <odersky@gmail.com> | 2015-05-27 19:21:23 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-05-27 19:22:12 +0200 |
commit | 05679f3afccc2a3085bc089bccbdc03096fb90a0 (patch) | |
tree | 28d05222100fd9e6a3c23351a7c33d9f47bfe6ab | |
parent | d81fc0395d525f4dd0ec7d1707b3f0249b014edb (diff) | |
download | dotty-05679f3afccc2a3085bc089bccbdc03096fb90a0.tar.gz dotty-05679f3afccc2a3085bc089bccbdc03096fb90a0.tar.bz2 dotty-05679f3afccc2a3085bc089bccbdc03096fb90a0.zip |
Extended test case.
Also added non-unit fields and a class that directly implements two traits with the same fields.
-rw-r--r-- | src/dotty/tools/dotc/transform/ResolveSuper.scala | 4 | ||||
-rw-r--r-- | tests/run/traits-initialization.scala | 10 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/transform/ResolveSuper.scala b/src/dotty/tools/dotc/transform/ResolveSuper.scala index 9c0e34256..0f1c448d9 100644 --- a/src/dotty/tools/dotc/transform/ResolveSuper.scala +++ b/src/dotty/tools/dotc/transform/ResolveSuper.scala @@ -83,7 +83,7 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th def methodOverrides(mixin: ClassSymbol): List[Tree] = { def isOverridden(meth: Symbol) = meth.overridingSymbol(cls).is(Method, butNot = Deferred) def needsDisambiguation(meth: Symbol): Boolean = - meth.is(Method, butNot = PrivateOrDeferred) && + meth.is(Method, butNot = PrivateOrAccessorOrDeferred) && !isOverridden(meth) && !meth.allOverriddenSymbols.forall(_ is Deferred) for (meth <- mixin.info.decls.toList if needsDisambiguation(meth)) @@ -107,5 +107,5 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th else ddef } - private val PrivateOrDeferred = Private | Deferred + private val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred } diff --git a/tests/run/traits-initialization.scala b/tests/run/traits-initialization.scala index 2eee3d633..fdddc8f44 100644 --- a/tests/run/traits-initialization.scala +++ b/tests/run/traits-initialization.scala @@ -6,22 +6,32 @@ import store._ trait A { str += "a" + val i = 2 val s = str += 'A' str += '1' } trait B extends A { str += 'b' + override val i = 3 override val s = str += 'B' str += '2' } class D(sup: Unit) extends A { str += 'd' + override val i = 4 override val s = str += 'D' str += '3' } +class E(sup: Unit) extends A with B { + str += 'd' + override val i = 5 + override val s = str += 'E' + str += '3' +} + object Test extends D({str += "Z"}) with B { // should only have 2 fields |