diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-09-19 14:53:03 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-09-29 22:37:17 +0200 |
commit | 4595ac665674b25af776d499ae1da61bb297d379 (patch) | |
tree | 5ce5c591fba9237a10abc82e7efeb6e61b755952 /test/files/neg/t7859 | |
parent | 0aaf59149871f817a67c1fefcc3b0457fcb5e4fc (diff) | |
download | scala-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.scala | 5 | ||||
-rw-r--r-- | test/files/neg/t7859/B_2.scala | 9 |
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 +} |