summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala2
-rw-r--r--src/library/scala/runtime/StringAdd.scala7
-rw-r--r--src/library/scala/runtime/StringFormat.scala10
-rw-r--r--test/files/neg/valueclasses.check5
-rw-r--r--test/files/neg/valueclasses.scala2
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