summaryrefslogtreecommitdiff
path: root/test/files/neg/t7859
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-09-19 14:53:03 +0200
committerJason Zaugg <jzaugg@gmail.com>2013-09-29 22:37:17 +0200
commit4595ac665674b25af776d499ae1da61bb297d379 (patch)
tree5ce5c591fba9237a10abc82e7efeb6e61b755952 /test/files/neg/t7859
parent0aaf59149871f817a67c1fefcc3b0457fcb5e4fc (diff)
downloadscala-4595ac665674b25af776d499ae1da61bb297d379.tar.gz
scala-4595ac665674b25af776d499ae1da61bb297d379.tar.bz2
scala-4595ac665674b25af776d499ae1da61bb297d379.zip
SI-7859 Value classes may wrap a non-public member
We allow value class constructors to be non-public, so to be regular, we should also allow the same for the param accessor. This commit uses the 'makeNotPrivate' machinery to ensure that the backend can generate the requisite unboxing calls. This commit: - refactors the code that enforced the restrictions, improving a few error messages and positions. The remaining restrictions needed some rewording in light of this change. - allows value classes to have non-public, val parameters. private[this] / protected[this] are still disallowed as value classes don't have a concept of `this`, and because trying to accomdate then would complicate the implementation. This means that `class C(x: Int) extends AnyVal` is not allowed, the user still must write `private val x: Int` or `val x: Int`. - Outlaw `class C()()(val x: Int) extends AnyVal` to curtail any bugs that might lurk in such a formulation. The tests: - Show that the privacy is respected in the typer phase, under joint and separate compilation. We don't want a repeat performance of SI-6601. - Show that code that needs compiler-generated unboxes works under both compilation scenarios - Checks that the remaining restrictions are enforced and well communicated.
Diffstat (limited to 'test/files/neg/t7859')
-rw-r--r--test/files/neg/t7859/A_1.scala5
-rw-r--r--test/files/neg/t7859/B_2.scala9
2 files changed, 14 insertions, 0 deletions
diff --git a/test/files/neg/t7859/A_1.scala b/test/files/neg/t7859/A_1.scala
new file mode 100644
index 0000000000..e5b32d1c96
--- /dev/null
+++ b/test/files/neg/t7859/A_1.scala
@@ -0,0 +1,5 @@
+package p1 {
+ class A(private[p1] val x: Any) extends AnyVal
+}
+class B(private val x: Any) extends AnyVal
+
diff --git a/test/files/neg/t7859/B_2.scala b/test/files/neg/t7859/B_2.scala
new file mode 100644
index 0000000000..2e0556bc7b
--- /dev/null
+++ b/test/files/neg/t7859/B_2.scala
@@ -0,0 +1,9 @@
+class C(private val x: Any) extends AnyVal
+
+// Checking that makeNotPrivate(paramAccessor) doesn't make this visible during typer.
+// The output is identical with/without `extends AnyVal`.
+object Test {
+ new p1.A(x).x
+ new B(x).x
+ new C(x).x
+}