diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 2 | ||||
-rw-r--r-- | src/library/scala/runtime/StringAdd.scala | 7 | ||||
-rw-r--r-- | src/library/scala/runtime/StringFormat.scala | 10 | ||||
-rw-r--r-- | test/files/neg/valueclasses.check | 5 | ||||
-rw-r--r-- | test/files/neg/valueclasses.scala | 2 |
5 files changed, 19 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 5207fe8331..687c325760 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -103,7 +103,7 @@ trait Namers extends MethodSynthesis { def enclosingNamerWithScope(scope: Scope) = { var cx = context while (cx != NoContext && cx.scope != scope) cx = cx.outer - if (cx == context) thisNamer + if (cx == NoContext || cx == context) thisNamer else newNamer(cx) } diff --git a/src/library/scala/runtime/StringAdd.scala b/src/library/scala/runtime/StringAdd.scala index a1256c3f3b..a7e78ea9a3 100644 --- a/src/library/scala/runtime/StringAdd.scala +++ b/src/library/scala/runtime/StringAdd.scala @@ -8,8 +8,15 @@ package scala.runtime +/** A wrapper class that adds string concatenation `+` to any value */ final class StringAdd(val self: Any) { + // Note: The implicit conversion from Any to StringAdd is one of two + // implicit conversions from Any to AnyRef in Predef. It is important to have at least + // two such conversions, so that silent conversions from value types to AnyRef + // are avoided. If StringFormat should become a value class, another + // implicit conversion from Any to AnyRef has to be introduced in Predef + def +(other: String) = String.valueOf(self) + other } diff --git a/src/library/scala/runtime/StringFormat.scala b/src/library/scala/runtime/StringFormat.scala index 94bba4043c..1f0183afbb 100644 --- a/src/library/scala/runtime/StringFormat.scala +++ b/src/library/scala/runtime/StringFormat.scala @@ -8,7 +8,15 @@ package scala.runtime -final class StringFormat(val self: Any) extends AnyVal { +/** A wrapper class that adds a `formatted` operation to any value + */ +final class StringFormat(val self: Any) { + + // Note: The implicit conversion from Any to StringFormat is one of two + // implicit conversions from Any to AnyRef in Predef. It is important to have at least + // two such conversions, so that silent conversions from value types to AnyRef + // are avoided. If StringFormat should become a value class, another + // implicit conversion from Any to AnyRef has to be introduced in Predef /** Returns string formatted according to given `format` string. * Format strings are as for `String.format` diff --git a/test/files/neg/valueclasses.check b/test/files/neg/valueclasses.check index c4430c8e1a..30ee689511 100644 --- a/test/files/neg/valueclasses.check +++ b/test/files/neg/valueclasses.check @@ -34,13 +34,10 @@ 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 val y = x // fail ^ -valueclasses.scala:27: error: Type of parameter of value class may not be a type variable -class V10[T](val x: T) extends AnyVal // 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 class V13(x: Int) extends AnyVal // fail ^ -15 errors found +14 errors found diff --git a/test/files/neg/valueclasses.scala b/test/files/neg/valueclasses.scala index 2794a852ee..5979f6f684 100644 --- a/test/files/neg/valueclasses.scala +++ b/test/files/neg/valueclasses.scala @@ -24,7 +24,7 @@ class V9(val x: Int) extends AnyVal { val y = x // fail } -class V10[T](val x: T) extends AnyVal // fail +class V10[T](val x: T) extends AnyVal // ok class V11[T](val x: List[T]) extends AnyVal // ok class V12[@specialized T, U](val x: (T, U)) extends AnyVal // fail |