summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-01-10 19:20:55 +0000
committerPaul Phillips <paulp@improving.org>2011-01-10 19:20:55 +0000
commit9558f60e7ae165e10b41f0649535e95fee255199 (patch)
tree0763338b0d78a556723a129098bf2680435feb3a
parent059e8be4c78bbc10f31ff9e404d395b7cfaf52f6 (diff)
downloadscala-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.scala7
-rw-r--r--src/library/scala/collection/mutable/OpenHashMap.scala2
-rw-r--r--test/files/neg/bug2441.check4
-rw-r--r--test/files/neg/bug2441.scala15
-rw-r--r--test/files/pos/bug2441pos.scala8
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")
+}