diff options
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/Types.scala | 8 | ||||
-rw-r--r-- | tests/run/paramForwarding_separate.check | 6 | ||||
-rw-r--r-- | tests/run/paramForwarding_separate/A_1.scala | 3 | ||||
-rw-r--r-- | tests/run/paramForwarding_separate/B_2.scala | 19 |
4 files changed, 34 insertions, 2 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/Types.scala b/compiler/src/dotty/tools/dotc/core/Types.scala index abc496ec0..c88342e12 100644 --- a/compiler/src/dotty/tools/dotc/core/Types.scala +++ b/compiler/src/dotty/tools/dotc/core/Types.scala @@ -1585,8 +1585,12 @@ object Types { protected def asMemberOf(prefix: Type)(implicit ctx: Context): Denotation = if (name.isShadowedName) prefix.nonPrivateMember(name.revertShadowed) - else prefix.member(name) - + else { + val d = lastDenotation + // Never go from a non-private denotation to a private one + if (d == null || d.symbol.is(Private)) prefix.member(name) + else prefix.nonPrivateMember(name) + } /** (1) Reduce a type-ref `W # X` or `W { ... } # U`, where `W` is a wildcard type * to an (unbounded) wildcard type. diff --git a/tests/run/paramForwarding_separate.check b/tests/run/paramForwarding_separate.check new file mode 100644 index 000000000..8df0c3100 --- /dev/null +++ b/tests/run/paramForwarding_separate.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_separate/A_1.scala b/tests/run/paramForwarding_separate/A_1.scala new file mode 100644 index 000000000..7e01f3ef1 --- /dev/null +++ b/tests/run/paramForwarding_separate/A_1.scala @@ -0,0 +1,3 @@ +class A(val member: Int) + +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 new file mode 100644 index 000000000..774967101 --- /dev/null +++ b/tests/run/paramForwarding_separate/B_2.scala @@ -0,0 +1,19 @@ +class B(member: Int) extends SubA(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]) + } +} |