summaryrefslogtreecommitdiff
path: root/test/files/neg/t5691.scala
diff options
context:
space:
mode:
authorAntoine Gourlay <antoine@gourlay.fr>2014-07-31 17:52:13 +0200
committerAntoine Gourlay <antoine@gourlay.fr>2014-08-12 15:47:20 +0200
commit756e551b30461b548ea59e99562634775b7ebd74 (patch)
tree678fd556b17768d1cf533135bbfd1741df025d8d /test/files/neg/t5691.scala
parent84d4ebc19a1e54dbe446ef35b71efa7ad3890c19 (diff)
downloadscala-756e551b30461b548ea59e99562634775b7ebd74.tar.gz
scala-756e551b30461b548ea59e99562634775b7ebd74.tar.bz2
scala-756e551b30461b548ea59e99562634775b7ebd74.zip
SI-5691 lint warning when a type parameter shadows an existing type.
This adds a new lint warning for when a class/method/type-member's type parameter shadows an existing type: `-Xlint:type-parameter-shadow`. It excludes type parameters of synthetic methods (the user can't rename or remove those anyway), otherwise, for example, every case class triggers the warning. Also fixes a test that contained wrong java sources (that didn't even compile...), discovered thanks to the warning. --- This kind of errors shows up every now and then on the mailing-list, on stackoverflow, etc. so maybe a warning would be useful. I was afraid this would yield too many warnings for libraries that are heavy on type parameters, but no: running this on scalaz and shapeless HEAD (`v7.1.0-RC1-41-g1cc0a96` and `v2.0.0-M1-225-g78426a0` respectively) yields 44 warnings. None of them are false positives; they usually come from: - scalaz loving using `A` as type parameter, even several levels deep of parametrized classes/methods - or calling a type parameter that will hold a map `Map`, or similar, thus shadowing an existing type
Diffstat (limited to 'test/files/neg/t5691.scala')
-rw-r--r--test/files/neg/t5691.scala27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/files/neg/t5691.scala b/test/files/neg/t5691.scala
new file mode 100644
index 0000000000..e6a9bdc16a
--- /dev/null
+++ b/test/files/neg/t5691.scala
@@ -0,0 +1,27 @@
+class B {
+
+ type T = Int
+ trait D
+
+ // method parameter shadows some other type
+ def foobar[D](in: D) = in.toString
+
+ // type member's parameter shadows some other type
+ type MySeq[D] = Seq[D]
+
+ // class parameter shadows some other type
+ class Foo[T](t: T) {
+ // a type parameter shadows another type parameter
+ def bar[T](w: T) = w.toString
+ }
+
+ // even deeply nested...
+ class C[M[List[_]]]
+ type E[M[List[_]]] = Int
+ def foo[N[M[List[_]]]] = ???
+
+ // ...but not between type parameters in the same list
+ class F[A, M[L[A]]] // no warning!
+ type G[A, M[L[A]]] = Int // no warning!
+ def bar[A, N[M[L[A]]]] = ??? // no warning!
+}