diff options
author | Paul Phillips <paulp@improving.org> | 2011-01-10 19:20:55 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-01-10 19:20:55 +0000 |
commit | 9558f60e7ae165e10b41f0649535e95fee255199 (patch) | |
tree | 0763338b0d78a556723a129098bf2680435feb3a | |
parent | 059e8be4c78bbc10f31ff9e404d395b7cfaf52f6 (diff) | |
download | scala-9558f60e7ae165e10b41f0649535e95fee255199.tar.gz scala-9558f60e7ae165e10b41f0649535e95fee255199.tar.bz2 scala-9558f60e7ae165e10b41f0649535e95fee255199.zip |
A test case for recently fixed #4114. Plus!
I had closed #2441 as a duplicate of that, but unfortunately #4114 did
not bring #2441 along with it. Then I realized I'm a programmer, not a
helpless trac watcher. As is often the case with thes things, fixing
that revealed a bug in the library. Closes #2441 for real, review by
odersky.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 7 | ||||
-rw-r--r-- | src/library/scala/collection/mutable/OpenHashMap.scala | 2 | ||||
-rw-r--r-- | test/files/neg/bug2441.check | 4 | ||||
-rw-r--r-- | test/files/neg/bug2441.scala | 15 | ||||
-rw-r--r-- | test/files/pos/bug2441pos.scala | 8 |
5 files changed, 32 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 7788ff489c..2b6bf6080c 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -366,11 +366,12 @@ trait Typers extends Modes { def checkNoEscape(sym: Symbol) { if (sym.isPrivate && !sym.hasFlag(SYNTHETIC_PRIVATE)) { var o = owner - while (o != NoSymbol && o != sym.owner && - !o.isLocal && !o.hasFlag(PRIVATE) && + while (o != NoSymbol && o != sym.owner && o != sym.owner.linkedClassOfClass && + !o.isLocal && !o.isPrivate && !o.privateWithin.hasTransOwner(sym.owner)) o = o.owner - if (o == sym.owner) addHidden(sym) + if (o == sym.owner || o == sym.owner.linkedClassOfClass) + addHidden(sym) } else if (sym.owner.isTerm && !sym.isTypeParameterOrSkolem) { var e = scope.lookupEntry(sym.name) var found = false diff --git a/src/library/scala/collection/mutable/OpenHashMap.scala b/src/library/scala/collection/mutable/OpenHashMap.scala index 418c35d7d6..9c31cc5a6f 100644 --- a/src/library/scala/collection/mutable/OpenHashMap.scala +++ b/src/library/scala/collection/mutable/OpenHashMap.scala @@ -67,7 +67,7 @@ extends Map[Key, Value] with MapLike[Key, Value, OpenHashMap[Key, Value]] { import OpenHashMap.OpenEntry - type Entry = OpenEntry[Key, Value] + private type Entry = OpenEntry[Key, Value] /** * A default constructor creates a hashmap with initial size 8. diff --git a/test/files/neg/bug2441.check b/test/files/neg/bug2441.check new file mode 100644 index 0000000000..2c82e6a9f8 --- /dev/null +++ b/test/files/neg/bug2441.check @@ -0,0 +1,4 @@ +bug2441.scala:12: error: private class Y escapes its defining scope as part of type Some[B.Y] + override def f = Some(new B.Y) + ^ +one error found diff --git a/test/files/neg/bug2441.scala b/test/files/neg/bug2441.scala new file mode 100644 index 0000000000..6784ebb333 --- /dev/null +++ b/test/files/neg/bug2441.scala @@ -0,0 +1,15 @@ +trait X +trait A { + def f: Option[X] + def g: Option[X] +} +object B { + private class Y extends X { val y = 42 } +} +class B extends A { + private class Bippy + + override def f = Some(new B.Y) + override def g: Option[X] = Some(new B.Y) +} + diff --git a/test/files/pos/bug2441pos.scala b/test/files/pos/bug2441pos.scala new file mode 100644 index 0000000000..25eb2232c9 --- /dev/null +++ b/test/files/pos/bug2441pos.scala @@ -0,0 +1,8 @@ +abstract class A { + private def foo = List(1, 2) +} +trait B extends A { + private def foo = List("a", "b") + // However it compiles correctly if the type is given: + // private def foo: List[String] = List("a", "b") +} |