aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/transform/ParamForwarding.scala12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/transform/ParamForwarding.scala b/src/dotty/tools/dotc/transform/ParamForwarding.scala
index a10339f85..2e6a97bcf 100644
--- a/src/dotty/tools/dotc/transform/ParamForwarding.scala
+++ b/src/dotty/tools/dotc/transform/ParamForwarding.scala
@@ -33,6 +33,18 @@ class ParamForwarding(thisTransformer: DenotTransformer) {
case _ => (Nil, Nil)
}
def inheritedAccessor(sym: Symbol): Symbol = {
+ /**
+ * Dmitry: having it have the same name is needed to maintain correctness in presence of subclassing
+ * if you would use parent param-name `a` to implement param-field `b`
+ * overriding field `b` will actually override field `a`, that is wrong!
+ *
+ * class A(val s: Int);
+ * class B(val b: Int) extends A(b)
+ * class C extends A(2) {
+ * def s = 3
+ * assert(this.b == 2)
+ * }
+ */
val candidate = sym.owner.asClass.superClass
.info.decl(sym.name).suchThat(_ is (ParamAccessor, butNot = Mutable)).symbol
if (candidate.isAccessibleFrom(currentClass.thisType, superAccess = true)) candidate