summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-01-04 04:54:35 +0000
committerPaul Phillips <paulp@improving.org>2011-01-04 04:54:35 +0000
commit7c34a1af9612cc696fef9f4d62d1a9a9ef8ff9ae (patch)
tree554896cc74c2ac36dc7723b4aadb7849f63d8482
parentc0a4e5acdc23bbfae3d4035b7922f3f3841cc822 (diff)
downloadscala-7c34a1af9612cc696fef9f4d62d1a9a9ef8ff9ae.tar.gz
scala-7c34a1af9612cc696fef9f4d62d1a9a9ef8ff9ae.tar.bz2
scala-7c34a1af9612cc696fef9f4d62d1a9a9ef8ff9ae.zip
Protected protected constructors.
since r19547, which was for #1836 but loosened the noose too much. Closes #4128, review by odersky.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala2
-rw-r--r--test/files/neg/protected-constructors.check25
-rw-r--r--test/files/neg/protected-constructors.scala21
3 files changed, 47 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index 7f0be68fca..0aeea8174a 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -371,6 +371,7 @@ trait Contexts { self: Analyzer =>
*/
def isAccessible(sym: Symbol, pre: Type, superAccess: Boolean): Boolean = {
lastAccessCheckDetails = ""
+ // Console.println("isAccessible(%s, %s, %s)".format(sym, pre, superAccess))
@inline def accessWithinLinked(ab: Symbol) = {
val linked = ab.linkedClassOfClass
@@ -445,7 +446,6 @@ trait Contexts { self: Analyzer =>
|| sym.isProtected &&
( superAccess
|| pre.isInstanceOf[ThisType]
- || sym.isConstructor
|| phase.erasedTypes
|| isProtectedAccessOK(sym)
|| (sym.allOverriddenSymbols exists isProtectedAccessOK)
diff --git a/test/files/neg/protected-constructors.check b/test/files/neg/protected-constructors.check
new file mode 100644
index 0000000000..d6b9221a49
--- /dev/null
+++ b/test/files/neg/protected-constructors.check
@@ -0,0 +1,25 @@
+protected-constructors.scala:17: error: too many arguments for constructor Foo1: ()dingus.Foo1
+ val foo1 = new Foo1("abc")
+ ^
+protected-constructors.scala:18: error: constructor Foo2 in class Foo2 cannot be accessed in object P
+ Access to protected constructor Foo2 not permitted because
+ enclosing class object P in package hungus is not a subclass of
+ class Foo2 in package dingus where target is defined
+ val foo2 = new Foo2("abc")
+ ^
+protected-constructors.scala:19: error: class Foo3 in object Ding cannot be accessed in object dingus.Ding
+ Access to protected class Foo3 not permitted because
+ enclosing class object P in package hungus is not a subclass of
+ object Ding in package dingus where target is defined
+ val foo3 = new Ding.Foo3("abc")
+ ^
+protected-constructors.scala:15: error: class Foo3 in object Ding cannot be accessed in object dingus.Ding
+ Access to protected class Foo3 not permitted because
+ enclosing class object P in package hungus is not a subclass of
+ object Ding in package dingus where target is defined
+ class Bar3 extends Ding.Foo3("abc")
+ ^
+protected-constructors.scala:15: error: too many arguments for constructor Object: ()java.lang.Object
+ class Bar3 extends Ding.Foo3("abc")
+ ^
+5 errors found
diff --git a/test/files/neg/protected-constructors.scala b/test/files/neg/protected-constructors.scala
new file mode 100644
index 0000000000..2838caf09c
--- /dev/null
+++ b/test/files/neg/protected-constructors.scala
@@ -0,0 +1,21 @@
+package dingus {
+ class Foo1() { protected def this(name: String) = this() }
+ class Foo2 protected (name: String) { }
+ object Ding {
+ protected class Foo3(name: String) { }
+ }
+}
+
+package hungus {
+ import dingus._
+
+ object P {
+ class Bar1 extends Foo1("abc")
+ class Bar2 extends Foo2("abc")
+ class Bar3 extends Ding.Foo3("abc")
+
+ val foo1 = new Foo1("abc")
+ val foo2 = new Foo2("abc")
+ val foo3 = new Ding.Foo3("abc")
+ }
+}