aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/src/dotty/tools/dotc/core/Types.scala8
-rw-r--r--tests/run/paramForwarding_separate.check6
-rw-r--r--tests/run/paramForwarding_separate/A_1.scala3
-rw-r--r--tests/run/paramForwarding_separate/B_2.scala19
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])
+ }
+}