diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-12-28 02:40:44 +0300 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-12-28 22:24:16 +0300 |
commit | 4b9e8e34171e2162af2b1ce7faef45c31814a477 (patch) | |
tree | c5acfe4e0659228bdf45c917af42c48644537f9b /test/files/run | |
parent | 9f0594c57716ed551918e15be6da843982e8ba12 (diff) | |
download | scala-4b9e8e34171e2162af2b1ce7faef45c31814a477.tar.gz scala-4b9e8e34171e2162af2b1ce7faef45c31814a477.tar.bz2 scala-4b9e8e34171e2162af2b1ce7faef45c31814a477.zip |
codifies the state of the art wrt SI-8104
As it was discovered in SI-8104, whiteboxity doesn’t apply equally to
type parameters and type members of materialized type classes.
During implicit search and subsequent type inference, whitebox type parameters
are consistently erased to wildcards, whereas whitebox type members sometimes
remain as is and get in the way of signature conformance checks.
Diffstat (limited to 'test/files/run')
-rw-r--r-- | test/files/run/t8104.check | 1 | ||||
-rw-r--r-- | test/files/run/t8104/Macros_1.scala | 11 | ||||
-rw-r--r-- | test/files/run/t8104/Test_2.scala | 16 |
3 files changed, 28 insertions, 0 deletions
diff --git a/test/files/run/t8104.check b/test/files/run/t8104.check new file mode 100644 index 0000000000..c2593eb199 --- /dev/null +++ b/test/files/run/t8104.check @@ -0,0 +1 @@ +TypeTag[(Int, Int)] diff --git a/test/files/run/t8104/Macros_1.scala b/test/files/run/t8104/Macros_1.scala new file mode 100644 index 0000000000..21d81a3687 --- /dev/null +++ b/test/files/run/t8104/Macros_1.scala @@ -0,0 +1,11 @@ +import scala.reflect.macros.WhiteboxContext + +object Macros { + def impl[T](c: WhiteboxContext)(implicit T: c.WeakTypeTag[T]) = { + import c.universe._ + 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)) + q"new Generic[$T]{ type Repr = $Repr }" + } +}
\ No newline at end of file diff --git a/test/files/run/t8104/Test_2.scala b/test/files/run/t8104/Test_2.scala new file mode 100644 index 0000000000..630176f175 --- /dev/null +++ b/test/files/run/t8104/Test_2.scala @@ -0,0 +1,16 @@ +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) + + import scala.reflect.runtime.universe._ + def reprify[T, Repr](x: T)(implicit generic: Generic.Aux[T, Repr], tag: TypeTag[Repr]) = println(tag) + reprify(C(40, 2)) + + implicitly[Generic.Aux[C, (Int, Int)]] +} |