aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-05-27 19:21:23 +0200
committerMartin Odersky <odersky@gmail.com>2015-05-27 19:22:12 +0200
commit05679f3afccc2a3085bc089bccbdc03096fb90a0 (patch)
tree28d05222100fd9e6a3c23351a7c33d9f47bfe6ab
parentd81fc0395d525f4dd0ec7d1707b3f0249b014edb (diff)
downloaddotty-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.scala4
-rw-r--r--tests/run/traits-initialization.scala10
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