scala/scala — pull request #1109 by paulp (2012-08-09 21:34:31+00:00)
Title: Warn when Any or AnyVal is inferred.

For the very small price of annotating types as Any/AnyVal in those
cases where we wish to use them, we can obtain useful warnings.
I made trunk clean against this warning and found several bugs
or at least suboptimalities in the process.

I put the warning behind -Xlint for the moment, but I think this
belongs on by default, even for this alone:

scala> List(1, 2, 3) contains "a"
:8: warning: a type was inferred to be `Any`; this may indicate a programming error.
List(1, 2, 3) contains "a"
^
res0: Boolean = false

Or this punishment meted out by SI-4042:

scala> 1l to 5l contains 5
:8: warning: a type was inferred to be `AnyVal`; this may indicate a programming error.
1l to 5l contains 5
^
res0: Boolean = false

A different situation where this arises, which I have seen variations
of many times:

scala> class A[T](default: T) {
def get(x: => Option[T]) = x getOrElse Some(default)
}
:7: warning: a type was inferred to be `Any`; this may indicate a programming error.
class A[T](default: T) { def get(x: => Option[T]) = x getOrElse Some(default) }
^
// Oops, this was what I meant
scala> class A[T](default: T) {
def get(x: => Option[T]) = x getOrElse default
}
defined class A

Harder to avoid spurious warnings when "Object" is inferred.