summaryrefslogtreecommitdiff
path: root/test/files/run/t6318_derived.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2012-09-06 21:05:17 +0200
committerEugene Burmako <xeno.by@gmail.com>2012-09-06 23:19:20 +0200
commit6a740332c7bfd56b20993be6ecd0bf818104f56c (patch)
tree6884bd48506c9e2468d07cfcf7433121c04cfac2 /test/files/run/t6318_derived.scala
parentadf2d3632b07eef4fc2303aef994e66584a73f49 (diff)
downloadscala-6a740332c7bfd56b20993be6ecd0bf818104f56c.tar.gz
scala-6a740332c7bfd56b20993be6ecd0bf818104f56c.tar.bz2
scala-6a740332c7bfd56b20993be6ecd0bf818104f56c.zip
SI-6318 fixes ClassTag.unapply for primitives
ClassTag.unapply now has overloads for primitive value classes so that it can preserve boxiness when performing subtyping tests. First I wanted to annotate ClassTag.unapply with a ClassTag itself, i.e. to transform its signature from "def unapply(x: Any): Option[T]" to "def unapply[U: ClassTag](x: U): Option[T]". But then virtpatmat_typetag.scala exhibited a nasty problem. When pattern matching with this unapply, patmat first infers U as something and then tries to pattern match against this inferred type. And if U gets inferred as an abstract type itself, bad things happen: warning: The outer reference in this type test cannot be checked at run time. That's why I decided to drop the ClassTag idea and go with 9 extra overloads. Not very beautiful, but definitely robust.
Diffstat (limited to 'test/files/run/t6318_derived.scala')
-rw-r--r--test/files/run/t6318_derived.scala15
1 files changed, 15 insertions, 0 deletions
diff --git a/test/files/run/t6318_derived.scala b/test/files/run/t6318_derived.scala
new file mode 100644
index 0000000000..ccdc18daee
--- /dev/null
+++ b/test/files/run/t6318_derived.scala
@@ -0,0 +1,15 @@
+import scala.reflect.{ClassTag, classTag}
+
+object Test extends App {
+ def test[T: ClassTag](x: T) {
+ println(classTag[T].runtimeClass.isAssignableFrom(x.getClass))
+ println(classTag[T].unapply(x))
+ }
+
+ class X(val x: Int) extends AnyVal { override def toString = "X" }
+ val x = new X(1)
+ // the commented line crashes because of SI-6326
+ //println(classTag[X].runtimeClass.isAssignableFrom(x.getClass))
+ println(classTag[X].unapply(x))
+ test(x)
+} \ No newline at end of file