diff --git a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala index 859ac8b069bb..24e2911f2a10 100644 --- a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala +++ b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala @@ -48,7 +48,7 @@ class ParamForwarding(thisTransformer: DenotTransformer) { val candidate = sym.owner.asClass.superClass .info.decl(sym.name).suchThat(_ is (ParamAccessor, butNot = Mutable)).symbol if (candidate.isAccessibleFrom(currentClass.thisType, superAccess = true)) candidate - else if (candidate is Method) inheritedAccessor(candidate) + else if (candidate.exists) inheritedAccessor(candidate) else NoSymbol } def forwardParamAccessor(stat: Tree): Tree = { diff --git a/tests/run/paramForwarding.check b/tests/run/paramForwarding.check index c004a95be78a..e91447784f0d 100644 --- a/tests/run/paramForwarding.check +++ b/tests/run/paramForwarding.check @@ -13,4 +13,4 @@ NonVal: X: private final int X.theValue$$local Y: -private final int Y.theValue$$local + diff --git a/tests/run/paramForwarding.scala b/tests/run/paramForwarding.scala index 61466b621725..bd0654d39c1b 100644 --- a/tests/run/paramForwarding.scala +++ b/tests/run/paramForwarding.scala @@ -36,8 +36,8 @@ class NonVal(theValue: Int) extends A(theValue) { // X.theValue() which overrides A.theValue() class X(override val theValue: Int) extends NonVal(0) -// Y contains a field Y.theValue$$local accessible using the getter -// Y.theValue() which overrides A.theValue() +// Y does not contains a field Y.theValue$$local, it contains +// a getter Y.theValue() which only calls super.theValue() class Y(override val theValue: Int) extends NonVal(theValue) diff --git a/tests/run/paramForwarding_separate/A_1.scala b/tests/run/paramForwarding_separate/A_1.scala index 7e01f3ef1df9..d44cea3abb88 100644 --- a/tests/run/paramForwarding_separate/A_1.scala +++ b/tests/run/paramForwarding_separate/A_1.scala @@ -1,3 +1,8 @@ -class A(val member: Int) +class A(val member: Int) { + def getAMember = member +} + +class SubA(member: Int) extends A(member) { + def getSubAMember = member +} -class SubA(member: Int) extends A(member) diff --git a/tests/run/paramForwarding_separate/B_2.scala b/tests/run/paramForwarding_separate/B_2.scala index 7749671019ea..7c13018b7019 100644 --- a/tests/run/paramForwarding_separate/B_2.scala +++ b/tests/run/paramForwarding_separate/B_2.scala @@ -1,4 +1,6 @@ -class B(member: Int) extends SubA(member) +class B(member: Int) extends SubA(member) { + def getMember = member +} object Test { def printFields(cls: Class[_]) = diff --git a/tests/run/paramForwarding_together.check b/tests/run/paramForwarding_together.check new file mode 100644 index 000000000000..8df0c31008df --- /dev/null +++ b/tests/run/paramForwarding_together.check @@ -0,0 +1,6 @@ +# Fields in A: +private final int A.member$$local +# Fields in SubA: + +# Fields in B: + diff --git a/tests/run/paramForwarding_together.scala b/tests/run/paramForwarding_together.scala new file mode 100644 index 000000000000..670411e58049 --- /dev/null +++ b/tests/run/paramForwarding_together.scala @@ -0,0 +1,29 @@ +class A(val member: Int) { + def getAMember = member +} + +class SubA(member: Int) extends A(member) { + def getSubAMember = member +} + +class B(member: Int) extends SubA(member) { + def getBMember = member +} + +object Test { + def printFields(cls: Class[_]) = + println(cls.getDeclaredFields.map(_.toString).sorted.deep.mkString("\n")) + + def main(args: Array[String]): Unit = { + val a = new A(10) + val subA = new SubA(11) + val b = new B(12) + + println("# Fields in A:") + printFields(classOf[A]) + println("# Fields in SubA:") + printFields(classOf[SubA]) + println("# Fields in B:") + printFields(classOf[B]) + } +} diff --git a/tests/run/paramForwarding_together_b.check b/tests/run/paramForwarding_together_b.check new file mode 100644 index 000000000000..8df0c31008df --- /dev/null +++ b/tests/run/paramForwarding_together_b.check @@ -0,0 +1,6 @@ +# Fields in A: +private final int A.member$$local +# Fields in SubA: + +# Fields in B: + diff --git a/tests/run/paramForwarding_together_b.scala b/tests/run/paramForwarding_together_b.scala new file mode 100644 index 000000000000..cb61cd11fb39 --- /dev/null +++ b/tests/run/paramForwarding_together_b.scala @@ -0,0 +1,30 @@ +class B(member: Int) extends SubA(member) { + def getBMember = member +} + +class SubA(member: Int) extends A(member) { + def getSubAMember = member +} + +class A(val member: Int) { + def getAMember = member +} + + +object Test { + def printFields(cls: Class[_]) = + println(cls.getDeclaredFields.map(_.toString).sorted.deep.mkString("\n")) + + def main(args: Array[String]): Unit = { + val a = new A(10) + val subA = new SubA(11) + val b = new B(12) + + println("# Fields in A:") + printFields(classOf[A]) + println("# Fields in SubA:") + printFields(classOf[SubA]) + println("# Fields in B:") + printFields(classOf[B]) + } +}