summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-11-10 15:02:54 +0000
committerPaul Phillips <paulp@improving.org>2010-11-10 15:02:54 +0000
commit37d9130f9fa9d90d2e4b31d3004e4e1b1df58d5c (patch)
tree66631774a075482bb6f8221a671f3e12b34fed5e
parent903478337c9b83ea9317d1dab311c62f654a7a45 (diff)
downloadscala-37d9130f9fa9d90d2e4b31d3004e4e1b1df58d5c.tar.gz
scala-37d9130f9fa9d90d2e4b31d3004e4e1b1df58d5c.tar.bz2
scala-37d9130f9fa9d90d2e4b31d3004e4e1b1df58d5c.zip
protected[this] members should be accessible to...
protected[this] members should be accessible to super.x calls. Closes #464, review by odersky.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala16
-rw-r--r--test/files/neg/bug464-neg.check16
-rw-r--r--test/files/neg/bug464-neg.scala12
-rw-r--r--test/files/pos/bug464.scala13
4 files changed, 50 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 3d3fbae811..fc1ec8e5e5 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -681,13 +681,15 @@ trait Typers { self: Analyzer =>
}
/** The member with given name of given qualifier tree */
- def member(qual: Tree, name: Name) = qual.tpe match {
- case ThisType(clazz) if (context.enclClass.owner.hasTransOwner(clazz)) =>
- // println("member "+qual.tpe+" . "+name+" "+qual.tpe.getClass)
- qual.tpe.member(name)
- case _ =>
- if (phase.next.erasedTypes) qual.tpe.member(name)
- else qual.tpe.nonLocalMember(name)
+ def member(qual: Tree, name: Name) = {
+ def callSiteWithinClass(clazz: Symbol) = context.enclClass.owner hasTransOwner clazz
+ val includeLocals = qual.tpe match {
+ case ThisType(clazz) if callSiteWithinClass(clazz) => true
+ case SuperType(clazz, _) if callSiteWithinClass(clazz.typeSymbol) => true
+ case _ => phase.next.erasedTypes
+ }
+ if (includeLocals) qual.tpe member name
+ else qual.tpe nonLocalMember name
}
def silent[T](op: Typer => T,
diff --git a/test/files/neg/bug464-neg.check b/test/files/neg/bug464-neg.check
new file mode 100644
index 0000000000..7921c5a4f8
--- /dev/null
+++ b/test/files/neg/bug464-neg.check
@@ -0,0 +1,16 @@
+bug464-neg.scala:7: error: not found: value f1
+ f1()
+ ^
+bug464-neg.scala:8: error: method f1 in class A cannot be accessed in A with ScalaObject
+ super.f1()
+ ^
+bug464-neg.scala:9: error: value f2 is not a member of B
+ def otherb(b2: B) = b2.f2()
+ ^
+bug464-neg.scala:10: error: method f3 in class A cannot be accessed in B
+ f3()
+ ^
+bug464-neg.scala:11: error: method f3 in class A cannot be accessed in A with ScalaObject
+ super.f3()
+ ^
+5 errors found
diff --git a/test/files/neg/bug464-neg.scala b/test/files/neg/bug464-neg.scala
new file mode 100644
index 0000000000..138fa8e869
--- /dev/null
+++ b/test/files/neg/bug464-neg.scala
@@ -0,0 +1,12 @@
+class A {
+ private[this] def f1() {}
+ protected[this] def f2() {}
+ private[A] def f3() {}
+}
+class B extends A {
+ f1()
+ super.f1()
+ def otherb(b2: B) = b2.f2()
+ f3()
+ super.f3()
+} \ No newline at end of file
diff --git a/test/files/pos/bug464.scala b/test/files/pos/bug464.scala
new file mode 100644
index 0000000000..45521335c3
--- /dev/null
+++ b/test/files/pos/bug464.scala
@@ -0,0 +1,13 @@
+class A {
+ protected[this] def f() {}
+}
+class B extends A {
+ f()
+ super.f()
+}
+class C extends A {
+ override protected[this] def f() = super.f()
+}
+class D extends C {
+ override protected def f() = super.f()
+} \ No newline at end of file