summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-12-30 07:16:05 -0800
committerJason Zaugg <jzaugg@gmail.com>2013-12-30 07:16:05 -0800
commit370d6d618884b886590ac8aa7f22a85cca45430a (patch)
tree3243811e36f132fa3c6e8741612133109821d9c9
parent97b9b2c06a5f562b749eb34834096118f21ca843 (diff)
parentc0cb1d891a663d474a50d34cdf097dc3c1a2d7cc (diff)
downloadscala-370d6d618884b886590ac8aa7f22a85cca45430a.tar.gz
scala-370d6d618884b886590ac8aa7f22a85cca45430a.tar.bz2
scala-370d6d618884b886590ac8aa7f22a85cca45430a.zip
Merge pull request #3312 from xeno-by/topic/fine-points-of-whiteboxity-210x
(2.10.x) codifies the state of the art wrt SI-8104
-rw-r--r--test/files/neg/t8104a.check4
-rw-r--r--test/files/neg/t8104a/Macros_1.scala23
-rw-r--r--test/files/neg/t8104a/Test_2.scala20
-rw-r--r--test/files/neg/t8104b.check4
-rw-r--r--test/files/neg/t8104b/Macros_1.scala23
-rw-r--r--test/files/neg/t8104b/Test_2.scala24
6 files changed, 98 insertions, 0 deletions
diff --git a/test/files/neg/t8104a.check b/test/files/neg/t8104a.check
new file mode 100644
index 0000000000..ef92c2e1ef
--- /dev/null
+++ b/test/files/neg/t8104a.check
@@ -0,0 +1,4 @@
+Test_2.scala:19: error: could not find implicit value for parameter e: Generic.Aux[Test.C,(Int, Int)]
+ implicitly[Generic.Aux[C, (Int, Int)]]
+ ^
+one error found
diff --git a/test/files/neg/t8104a/Macros_1.scala b/test/files/neg/t8104a/Macros_1.scala
new file mode 100644
index 0000000000..688d0694c0
--- /dev/null
+++ b/test/files/neg/t8104a/Macros_1.scala
@@ -0,0 +1,23 @@
+import scala.reflect.macros.Context
+
+object Macros {
+ def impl[T](c: Context)(implicit T: c.WeakTypeTag[T]) = {
+ import c.universe._
+ import Flag._
+ import definitions._
+ val fields = T.tpe.declarations.toList.collect{ case x: TermSymbol if x.isVal && x.isCaseAccessor => x }
+ val Repr = appliedType(TupleClass(fields.length).asType.toType, fields.map(_.typeSignature))
+ c.Expr(Block(
+ List(ClassDef(
+ Modifiers(FINAL),
+ newTypeName("$anon"),
+ List(),
+ Template(
+ List(AppliedTypeTree(Ident(newTypeName("Generic")), List(TypeTree(T.tpe)))),
+ emptyValDef,
+ List(
+ DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(Apply(Select(Super(This(tpnme.EMPTY), tpnme.EMPTY), nme.CONSTRUCTOR), List())), Literal(Constant(())))),
+ TypeDef(Modifiers(), newTypeName("Repr"), List(), TypeTree(Repr)))))),
+ Apply(Select(New(Ident(newTypeName("$anon"))), nme.CONSTRUCTOR), List())))
+ }
+} \ No newline at end of file
diff --git a/test/files/neg/t8104a/Test_2.scala b/test/files/neg/t8104a/Test_2.scala
new file mode 100644
index 0000000000..f601fc3570
--- /dev/null
+++ b/test/files/neg/t8104a/Test_2.scala
@@ -0,0 +1,20 @@
+trait Generic[T] { type Repr }
+object Generic {
+ type Aux[T, Repr0] = Generic[T] { type Repr = Repr0 }
+ import scala.language.experimental.macros
+ implicit def materializeGeneric[T]: Generic[T] = macro Macros.impl[T]
+}
+
+object Test extends App {
+ case class C(x: Int, y: Int)
+
+ def reprify[T, Repr](x: T)(implicit generic: Generic.Aux[T, Repr]) = ???
+ reprify(C(40, 2))
+
+ // this is a compilation error at the moment as explained in SI-8104
+ // because matchesPt in implicit search says that depoly(<type of materializeGeneric>) isn't a subtype of Generic.Aux[C, (Int, Int)]
+ // which is rightfully so, because depoly only replaces type parameters, not type members with wildcard types
+ // however in the future we might want to relax the matchesPt check, so this might start compiling
+ // therefore, if you've broken this test, then you should be happy, because most likely you've just enabled an interesting use case!
+ implicitly[Generic.Aux[C, (Int, Int)]]
+}
diff --git a/test/files/neg/t8104b.check b/test/files/neg/t8104b.check
new file mode 100644
index 0000000000..3214a132c2
--- /dev/null
+++ b/test/files/neg/t8104b.check
@@ -0,0 +1,4 @@
+Test_2.scala:16: error: could not find implicit value for parameter generic: Generic.Aux[Test.C,Repr]
+ reprify(C(40, 2))
+ ^
+one error found
diff --git a/test/files/neg/t8104b/Macros_1.scala b/test/files/neg/t8104b/Macros_1.scala
new file mode 100644
index 0000000000..688d0694c0
--- /dev/null
+++ b/test/files/neg/t8104b/Macros_1.scala
@@ -0,0 +1,23 @@
+import scala.reflect.macros.Context
+
+object Macros {
+ def impl[T](c: Context)(implicit T: c.WeakTypeTag[T]) = {
+ import c.universe._
+ import Flag._
+ import definitions._
+ val fields = T.tpe.declarations.toList.collect{ case x: TermSymbol if x.isVal && x.isCaseAccessor => x }
+ val Repr = appliedType(TupleClass(fields.length).asType.toType, fields.map(_.typeSignature))
+ c.Expr(Block(
+ List(ClassDef(
+ Modifiers(FINAL),
+ newTypeName("$anon"),
+ List(),
+ Template(
+ List(AppliedTypeTree(Ident(newTypeName("Generic")), List(TypeTree(T.tpe)))),
+ emptyValDef,
+ List(
+ DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(Apply(Select(Super(This(tpnme.EMPTY), tpnme.EMPTY), nme.CONSTRUCTOR), List())), Literal(Constant(())))),
+ TypeDef(Modifiers(), newTypeName("Repr"), List(), TypeTree(Repr)))))),
+ Apply(Select(New(Ident(newTypeName("$anon"))), nme.CONSTRUCTOR), List())))
+ }
+} \ No newline at end of file
diff --git a/test/files/neg/t8104b/Test_2.scala b/test/files/neg/t8104b/Test_2.scala
new file mode 100644
index 0000000000..a0d35942ba
--- /dev/null
+++ b/test/files/neg/t8104b/Test_2.scala
@@ -0,0 +1,24 @@
+trait Generic[T] { type Repr }
+object Generic {
+ type Aux[T, Repr0] = Generic[T] { type Repr = Repr0 }
+ import scala.language.experimental.macros
+ implicit def materializeGeneric[T, Repr]: Generic.Aux[T, Repr] = macro Macros.impl[T]
+}
+
+object Test extends App {
+ case class C(x: Int, y: Int)
+
+ // this doesn't work because of SI-7470
+ // well, in fact SI-7470 has been fixed: https://github.com/scala/scala/pull/2499
+ // it's just that the fix hasn't been backported to 2.10.x
+ // if you've made this compile, consider taking a look at the aforementioned pull request
+ def reprify[T, Repr](x: T)(implicit generic: Generic.Aux[T, Repr]) = ???
+ reprify(C(40, 2))
+
+ // this is a compilation error at the moment as explained in SI-8104
+ // because matchesPt in implicit search says that depoly(<type of materializeGeneric>) isn't a subtype of Generic.Aux[C, (Int, Int)]
+ // which is rightfully so, because depoly only replaces type parameters, not type members with wildcard types
+ // however in the future we might want to relax the matchesPt check, so this might start compiling
+ // therefore, if you've broken this test, then you should be happy, because most likely you've just enabled an interesting use case!
+ implicitly[Generic.Aux[C, (Int, Int)]]
+}