From 5d9cde105e804d14e2c15c3e15c147a56cb67ff1 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Wed, 3 Oct 2012 14:43:30 +0200 Subject: Put more implementation restrictions on value classes. Nested objects, classes and lazy vals are disallowed at any nesting level in value classes; e.g. lazy vals local to a method defined in a value class. There are still allowed in universal traits. This is a temporary, implementation restriction that is planned to be addressed in future releases of Scala. Error messages has been updated to communicate that intent. Moved tests for SI-5582 and SI-6408 to pending folder. They have to stay there until implementation restrictions are addressed. Closes SI-6408 and SI-6432. Review by @odersky, @harrah and @adriaanm. --- test/files/neg/t5882.check | 6 +++-- test/files/neg/t6359.check | 6 +++-- .../files/neg/valueclasses-impl-restrictions.check | 21 ++++++++++++++++ .../files/neg/valueclasses-impl-restrictions.scala | 28 ++++++++++++++++++++++ test/files/run/t5882.scala | 14 ----------- test/files/run/t6408.scala | 11 --------- test/pending/run/t5882.scala | 14 +++++++++++ test/pending/run/t6408.scala | 11 +++++++++ 8 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 test/files/neg/valueclasses-impl-restrictions.check create mode 100644 test/files/neg/valueclasses-impl-restrictions.scala delete mode 100644 test/files/run/t5882.scala delete mode 100644 test/files/run/t6408.scala create mode 100644 test/pending/run/t5882.scala create mode 100644 test/pending/run/t6408.scala (limited to 'test') diff --git a/test/files/neg/t5882.check b/test/files/neg/t5882.check index b9ca5a1b2a..e0958e19d9 100644 --- a/test/files/neg/t5882.check +++ b/test/files/neg/t5882.check @@ -1,7 +1,9 @@ -t5882.scala:4: error: nested object is not allowed in value class +t5882.scala:4: error: implementation restriction: nested class is not allowed in value class +This restriction is planned to be removed in subsequent releases. case class Scope() ^ -t5882.scala:5: error: nested object is not allowed in value class +t5882.scala:5: error: implementation restriction: nested object is not allowed in value class +This restriction is planned to be removed in subsequent releases. object Bar ^ two errors found diff --git a/test/files/neg/t6359.check b/test/files/neg/t6359.check index 2aa1ac5035..5bcdc57331 100644 --- a/test/files/neg/t6359.check +++ b/test/files/neg/t6359.check @@ -1,7 +1,9 @@ -t6359.scala:3: error: value class may not have nested module definitions +t6359.scala:3: error: implementation restriction: nested object is not allowed in value class +This restriction is planned to be removed in subsequent releases. object X ^ -t6359.scala:4: error: value class may not have nested class definitions +t6359.scala:4: error: implementation restriction: nested class is not allowed in value class +This restriction is planned to be removed in subsequent releases. class Y ^ two errors found diff --git a/test/files/neg/valueclasses-impl-restrictions.check b/test/files/neg/valueclasses-impl-restrictions.check new file mode 100644 index 0000000000..17d07ba960 --- /dev/null +++ b/test/files/neg/valueclasses-impl-restrictions.check @@ -0,0 +1,21 @@ +valueclasses-impl-restrictions.scala:3: error: implementation restriction: nested object is not allowed in value class +This restriction is planned to be removed in subsequent releases. + object X + ^ +valueclasses-impl-restrictions.scala:4: error: implementation restriction: lazy val is not allowed in value class +This restriction is planned to be removed in subsequent releases. + lazy val y = 1 + ^ +valueclasses-impl-restrictions.scala:10: error: implementation restriction: nested trait is not allowed in value class +This restriction is planned to be removed in subsequent releases. + trait I2 { + ^ +valueclasses-impl-restrictions.scala:16: error: implementation restriction: nested class is not allowed in value class +This restriction is planned to be removed in subsequent releases. + val i2 = new I2 { val q = x.s } + ^ +valueclasses-impl-restrictions.scala:22: error: implementation restriction: nested class is not allowed in value class +This restriction is planned to be removed in subsequent releases. + private[this] class I2(val q: String) + ^ +5 errors found diff --git a/test/files/neg/valueclasses-impl-restrictions.scala b/test/files/neg/valueclasses-impl-restrictions.scala new file mode 100644 index 0000000000..53396db958 --- /dev/null +++ b/test/files/neg/valueclasses-impl-restrictions.scala @@ -0,0 +1,28 @@ +class M(val t: Int) extends AnyVal { + def lazyString = { + object X + lazy val y = 1 + () => X + } +} + +class X1(val s: String) extends AnyVal { + trait I2 { + val q: String + def z = s + q + } + + def y(x: X1) = { + val i2 = new I2 { val q = x.s } + i2.z + } +} + +class X2(val s: String) extends AnyVal { + private[this] class I2(val q: String) + + def y(i: Int) = { + val i2 = new I2(i.toString) + i2.q + s + } +} diff --git a/test/files/run/t5882.scala b/test/files/run/t5882.scala deleted file mode 100644 index 47996d3068..0000000000 --- a/test/files/run/t5882.scala +++ /dev/null @@ -1,14 +0,0 @@ -// SIP-15 was revised to allow nested classes in value classes. -// This test checks that their basic functionality. - -class NodeOps(val n: Any) extends AnyVal { self => - class Foo() { def show = self.show(n) } - def show(x: Any) = x.toString -} - - -object Test extends App { - - val n = new NodeOps("abc") - assert(new n.Foo().show == "abc") -} diff --git a/test/files/run/t6408.scala b/test/files/run/t6408.scala deleted file mode 100644 index ff17480b35..0000000000 --- a/test/files/run/t6408.scala +++ /dev/null @@ -1,11 +0,0 @@ -class X(val i: Int) extends AnyVal { - class Inner(val q: Int) { - def plus = i + q - } -} - -object Test extends App { - val x = new X(11) - val i = new x.Inner(22) - assert(i.plus == 33) -} diff --git a/test/pending/run/t5882.scala b/test/pending/run/t5882.scala new file mode 100644 index 0000000000..47996d3068 --- /dev/null +++ b/test/pending/run/t5882.scala @@ -0,0 +1,14 @@ +// SIP-15 was revised to allow nested classes in value classes. +// This test checks that their basic functionality. + +class NodeOps(val n: Any) extends AnyVal { self => + class Foo() { def show = self.show(n) } + def show(x: Any) = x.toString +} + + +object Test extends App { + + val n = new NodeOps("abc") + assert(new n.Foo().show == "abc") +} diff --git a/test/pending/run/t6408.scala b/test/pending/run/t6408.scala new file mode 100644 index 0000000000..ff17480b35 --- /dev/null +++ b/test/pending/run/t6408.scala @@ -0,0 +1,11 @@ +class X(val i: Int) extends AnyVal { + class Inner(val q: Int) { + def plus = i + q + } +} + +object Test extends App { + val x = new X(11) + val i = new x.Inner(22) + assert(i.plus == 33) +} -- cgit v1.2.3