From 1e9277689461452c594dc547dc0b0ceab8cd3e7d Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 6 Mar 2012 17:48:42 +0100 Subject: Fixes to value classes: Flags now double definitions, private constructors as errors. Fixed erasure scheme. --- test/files/neg/anyval-anyref-parent.check | 6 +++--- test/files/neg/valueclasses-doubledefs.check | 7 +++++++ test/files/neg/valueclasses.check | 31 +++++++++++++++------------- 3 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 test/files/neg/valueclasses-doubledefs.check (limited to 'test/files/neg') diff --git a/test/files/neg/anyval-anyref-parent.check b/test/files/neg/anyval-anyref-parent.check index e1903f5fcc..fe20e5de81 100644 --- a/test/files/neg/anyval-anyref-parent.check +++ b/test/files/neg/anyval-anyref-parent.check @@ -1,10 +1,10 @@ -anyval-anyref-parent.scala:2: error: Only classes (not traits) are allowed to extend AnyVal +anyval-anyref-parent.scala:2: error: only classes (not traits) are allowed to extend AnyVal trait Foo2 extends AnyVal // fail ^ anyval-anyref-parent.scala:5: error: Any does not have a constructor class Bar1 extends Any // fail ^ -anyval-anyref-parent.scala:6: error: Value class needs to have exactly one public val parameter +anyval-anyref-parent.scala:6: error: value class needs to have exactly one public val parameter class Bar2(x: Int) extends AnyVal // fail ^ anyval-anyref-parent.scala:10: error: illegal inheritance; superclass Any @@ -17,7 +17,7 @@ anyval-anyref-parent.scala:11: error: illegal inheritance; superclass AnyVal of the mixin trait Immutable trait Foo5 extends AnyVal with Immutable // fail ^ -anyval-anyref-parent.scala:11: error: Only classes (not traits) are allowed to extend AnyVal +anyval-anyref-parent.scala:11: error: only classes (not traits) are allowed to extend AnyVal trait Foo5 extends AnyVal with Immutable // fail ^ 6 errors found diff --git a/test/files/neg/valueclasses-doubledefs.check b/test/files/neg/valueclasses-doubledefs.check new file mode 100644 index 0000000000..556d7a0900 --- /dev/null +++ b/test/files/neg/valueclasses-doubledefs.check @@ -0,0 +1,7 @@ +valueclasses-doubledefs.scala:5: error: double definition: +method apply:(x: Meter)String and +method apply:(x: Double)String at line 4 +have same type after erasure: (x: Double)String + def apply(x: Meter) = x.toString + ^ +one error found diff --git a/test/files/neg/valueclasses.check b/test/files/neg/valueclasses.check index 30ee689511..756a0474fa 100644 --- a/test/files/neg/valueclasses.check +++ b/test/files/neg/valueclasses.check @@ -1,43 +1,46 @@ -valueclasses.scala:3: error: Only classes (not traits) are allowed to extend AnyVal +valueclasses.scala:3: error: only classes (not traits) are allowed to extend AnyVal trait T extends AnyVal // fail ^ -valueclasses.scala:6: error: Value class may not be a member of another class +valueclasses.scala:6: error: value class may not be a member of another class class Bar(x: Int) extends AnyVal // fail ^ -valueclasses.scala:8: error: Value class may not be a local class +valueclasses.scala:8: error: value class may not be a local class class Baz(x: Int) extends AnyVal // fail ^ -valueclasses.scala:12: error: Value class needs to have exactly one public val parameter +valueclasses.scala:12: error: value class needs to have exactly one public val parameter class V1 extends AnyVal // fail ^ -valueclasses.scala:14: error: Value class needs to have a publicly accessible val parameter +valueclasses.scala:14: error: value class needs to have a publicly accessible val parameter class V2(private[test] val x: Int) extends AnyVal // fail ^ -valueclasses.scala:15: error: Value class needs to have a publicly accessible val parameter +valueclasses.scala:15: error: value class needs to have a publicly accessible val parameter class V3(protected[test] val x: Int) extends AnyVal // fail ^ -valueclasses.scala:16: error: Value class needs to have a publicly accessible val parameter +valueclasses.scala:16: error: value class needs to have a publicly accessible val parameter class V4(protected val x: Int) extends AnyVal // fail ^ -valueclasses.scala:17: error: Value class needs to have a publicly accessible val parameter +valueclasses.scala:17: error: value class needs to have a publicly accessible val parameter class V5(private val x: Int) extends AnyVal // fail ^ -valueclasses.scala:19: error: Value class needs to have exactly one public val parameter +valueclasses.scala:19: error: value class needs to have exactly one public val parameter class V6(val x: Int, val y: String) extends AnyVal // fail ^ -valueclasses.scala:20: error: Illegal parameter for value class +valueclasses.scala:20: error: illegal parameter for value class class V7(val x: Int, private[this] val y: String) extends AnyVal // fail ^ -valueclasses.scala:21: error: Value class needs to have exactly one public val parameter +valueclasses.scala:21: error: value class needs to have exactly one public val parameter class V8(var x: Int) extends AnyVal // fail ^ -valueclasses.scala:24: error: This statement is not allowed in value class: private[this] val y: Int = V9.this.x +valueclasses.scala:24: error: this statement is not allowed in value class: private[this] val y: Int = V9.this.x val y = x // fail ^ valueclasses.scala:29: error: type parameter of value class may not be specialized class V12[@specialized T, U](val x: (T, U)) extends AnyVal // fail ^ -valueclasses.scala:31: error: Value class needs to have exactly one public val parameter +valueclasses.scala:31: error: value class needs to have exactly one public val parameter class V13(x: Int) extends AnyVal // fail ^ -14 errors found +valueclasses.scala:45: error: value class must have public primary constructor +final class TOD private (val secondsOfDay: Int) extends AnyVal { // should fail with private constructor + ^ +15 errors found -- cgit v1.2.3