summaryrefslogtreecommitdiff
path: root/test/files
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-06-09 12:13:55 -0700
committerJason Zaugg <jzaugg@gmail.com>2013-06-09 12:13:55 -0700
commitd01cc65a298924156b6d98af94d9bcbb334d69b6 (patch)
treeae6fa0b2016c51d2f40883f80c0570220cd6f06c /test/files
parent3597a402a12eecd1c761eb7c9881f2c86024a1f1 (diff)
parent8518709d83b98bed6cac8437c3964e59f2ba5cd6 (diff)
downloadscala-d01cc65a298924156b6d98af94d9bcbb334d69b6.tar.gz
scala-d01cc65a298924156b6d98af94d9bcbb334d69b6.tar.bz2
scala-d01cc65a298924156b6d98af94d9bcbb334d69b6.zip
Merge pull request #2630 from retronym/ticket/6308
SI-6308 Specialize methods that have some unspecialized params
Diffstat (limited to 'test/files')
-rw-r--r--test/files/run/t6308.check16
-rw-r--r--test/files/run/t6308.scala41
2 files changed, 57 insertions, 0 deletions
diff --git a/test/files/run/t6308.check b/test/files/run/t6308.check
new file mode 100644
index 0000000000..e2577db72a
--- /dev/null
+++ b/test/files/run/t6308.check
@@ -0,0 +1,16 @@
+- Unspecialized type args
+// Specialized
+f1 f1$mIc$sp
+f2 f2$mIc$sp
+f3 f3$mIc$sp
+f4 f4$mIc$sp
+f5 f5$mIc$sp
+
+// Unspecialized type args
+f4(Boolean) f4
+f4(String) f4
+
+// Ideally these would be specialized
+todo1 todo1
+todo2 todo2
+todo3 todo3
diff --git a/test/files/run/t6308.scala b/test/files/run/t6308.scala
new file mode 100644
index 0000000000..bcd89359b0
--- /dev/null
+++ b/test/files/run/t6308.scala
@@ -0,0 +1,41 @@
+import scala.{specialized => sp}
+
+object Test {
+ def caller = new Exception().getStackTrace()(1).getMethodName
+ def f1[@sp(Int) A](a: A, b: Any) = caller
+ def f2[@sp(Int) A, B](a: A, b: String) = caller
+ def f3[B, @sp(Int) A](a: A, b: List[B]) = caller
+ def f4[B, @sp(Int) A](a: A, b: List[(A, B)]) = caller
+
+ def f5[@sp(Int) A, B <: Object](a: A, b: B) = caller
+
+ // `uncurryTreeType` calls a TypeMap on the call to this method and we end up with new
+ // type parameter symbols, which are not found in `TypeEnv.includes(typeEnv(member), env)`
+ // in `specSym`. (One of `uncurry`'s tasks is to expand type aliases in signatures.)
+ type T = Object
+ def todo1[@sp(Int) A, B <: T](a: A, b: String) = caller
+ def todo2[@sp(Int) A, B <: AnyRef](a: A, b: String) = caller
+ def todo3[B <: List[A], @specialized(Int) A](a: A, b: B) = caller
+
+ def main(args: Array[String]) {
+ val s = ""
+ val result =
+ s"""|- Unspecialized type args
+ |// Specialized
+ |f1 ${f1(1,"some ref")}
+ |f2 ${f2(1,"some ref")}
+ |f3 ${f3(1,List("some ref"))}
+ |f4 ${f4(1,Nil)}
+ |f5 ${f5(1,s)}
+ |
+ |// Unspecialized type args
+ |f4(Boolean) ${f4(Boolean,Nil)}
+ |f4(String) ${f4("",Nil)}
+ |
+ |// Ideally these would be specialized
+ |todo1 ${todo1(1,s)}
+ |todo2 ${todo2(1,s)}
+ |todo3 ${todo3(1,List(0))}""".stripMargin
+ println(result)
+ }
+}