summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Implicits.scala23
-rw-r--r--test/files/neg/unit2anyref.check6
2 files changed, 21 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
index 840ec1113d..adafcb2617 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
@@ -302,10 +302,25 @@ self: Analyzer =>
if (isView) {
val found = pt.typeArgs(0)
val req = pt.typeArgs(1)
- typeErrorMsg(found, req)+
- "\nNote that implicit conversions are not applicable because they are ambiguous:\n "+
- coreMsg+"are possible conversion functions from "+ found+" to "+req
- } else {
+
+ /** A nice spot to explain some common situations a little
+ * less confusingly.
+ */
+ def explanation = {
+ if ((found =:= AnyClass.tpe) && (AnyRefClass.tpe <:< req))
+ "Note: Any is not implicitly converted to AnyRef. You can safely\n" +
+ "pattern match x: AnyRef or cast x.asInstanceOf[AnyRef] to do so."
+ else if ((found <:< AnyValClass.tpe) && (AnyRefClass.tpe <:< req))
+ "Note: primitive types are not implicitly converted to AnyRef.\n" +
+ "You can safely force boxing by casting x.asInstanceOf[AnyRef]."
+ else
+ "Note that implicit conversions are not applicable because they are ambiguous:\n "+
+ coreMsg+"are possible conversion functions from "+ found+" to "+req
+ }
+
+ typeErrorMsg(found, req) + "\n" + explanation
+ }
+ else {
"ambiguous implicit values:\n "+coreMsg + "match expected type "+pt
})
}
diff --git a/test/files/neg/unit2anyref.check b/test/files/neg/unit2anyref.check
index 7af4564ffb..2616fd35f9 100644
--- a/test/files/neg/unit2anyref.check
+++ b/test/files/neg/unit2anyref.check
@@ -1,10 +1,8 @@
unit2anyref.scala:2: error: type mismatch;
found : Unit
required: AnyRef
-Note that implicit conversions are not applicable because they are ambiguous:
- both method any2stringadd in object Predef of type (x: Any)scala.runtime.StringAdd
- and method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
- are possible conversion functions from Unit to AnyRef
+Note: primitive types are not implicitly converted to AnyRef.
+You can safely force boxing by casting x.asInstanceOf[AnyRef].
val x: AnyRef = () // this should not succeed.
^
one error found