diff options
author | Paul Phillips <paulp@improving.org> | 2013-04-02 13:18:04 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2013-04-02 13:18:04 -0700 |
commit | 695c5359d3ffd68c602d14d42ecd23fe31aef3d9 (patch) | |
tree | 12a4de7c4495a23f1cafaa976313c8ea9f375be0 | |
parent | ef883690fe33f5f2e4c1c3a5f98ec42ae487e548 (diff) | |
parent | ca9c8efac5694d6dbfe1d0393c2e7485a01c3ef5 (diff) | |
download | scala-695c5359d3ffd68c602d14d42ecd23fe31aef3d9.tar.gz scala-695c5359d3ffd68c602d14d42ecd23fe31aef3d9.tar.bz2 scala-695c5359d3ffd68c602d14d42ecd23fe31aef3d9.zip |
Merge pull request #2319 from retronym/ticket/6793
SI-6793 Don't use super param accessors if inaccessible.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 11 | ||||
-rw-r--r-- | test/files/run/t6793.scala | 9 | ||||
-rw-r--r-- | test/files/run/t6793b.scala | 11 | ||||
-rw-r--r-- | test/files/run/t6793c.scala | 11 |
4 files changed, 40 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 67639eb530..fa72ad64bf 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -267,9 +267,16 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT } } - // direct calls to aliases of param accessors to the superclass in order to avoid + + def isAccessibleFromSuper(sym: Symbol) = { + val pre = SuperType(sym.owner.tpe, qual.tpe) + localTyper.context.isAccessible(sym, pre, superAccess = true) + } + + // Direct calls to aliases of param accessors to the superclass in order to avoid // duplicating fields. - if (sym.isParamAccessor && sym.alias != NoSymbol) { + // ... but, only if accessible (SI-6793) + if (sym.isParamAccessor && sym.alias != NoSymbol && isAccessibleFromSuper(sym.alias)) { val result = (localTyper.typedPos(tree.pos) { Select(Super(qual, tpnme.EMPTY) setPos qual.pos, sym.alias) }).asInstanceOf[Select] diff --git a/test/files/run/t6793.scala b/test/files/run/t6793.scala new file mode 100644 index 0000000000..0b1f1619af --- /dev/null +++ b/test/files/run/t6793.scala @@ -0,0 +1,9 @@ +package a { class C1(private[a] val v0: String) } +package b { class C2(v1: String) extends a.C1(v1) { def foo = v1 } } + +object Test extends App { + new b.C2("x") + + val c2Fields = classOf[b.C2].getDeclaredFields + assert(c2Fields.size == 1, c2Fields.map(_.getName).toList) +} diff --git a/test/files/run/t6793b.scala b/test/files/run/t6793b.scala new file mode 100644 index 0000000000..cb3f2fb2fa --- /dev/null +++ b/test/files/run/t6793b.scala @@ -0,0 +1,11 @@ +package a { + class C1(val v0: String) + class C2(v1: String) extends a.C1(v1) { def foo = v1 } +} + +object Test extends App { + new a.C2("x") + + val c2Fields = classOf[a.C2].getDeclaredFields + assert(c2Fields.isEmpty, c2Fields.map(_.getName).mkString(", ")) +} diff --git a/test/files/run/t6793c.scala b/test/files/run/t6793c.scala new file mode 100644 index 0000000000..e28c7c81a1 --- /dev/null +++ b/test/files/run/t6793c.scala @@ -0,0 +1,11 @@ +package a { + class C1(private[a] val v0: String) + class C2(v1: String) extends a.C1(v1) { def foo = v1 } +} + +object Test extends App { + new a.C2("x").foo + + val c2Fields = classOf[a.C2].getDeclaredFields + assert(c2Fields.isEmpty, c2Fields.map(_.getName).toList) +} |