summaryrefslogtreecommitdiff
path: root/test/files/pos/macro-implicit-invalidate-on-error.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2013-11-14 12:17:07 +0100
committerEugene Burmako <xeno.by@gmail.com>2013-11-14 12:17:07 +0100
commitee6fbae3d069d8fe55b7a20756c04abcc9119bba (patch)
treef99910e432b9d3d4ba2b426ac4343b4ba7f45873 /test/files/pos/macro-implicit-invalidate-on-error.scala
parent96df73d994097e3318d003ddef00194b711289a3 (diff)
downloadscala-ee6fbae3d069d8fe55b7a20756c04abcc9119bba.tar.gz
scala-ee6fbae3d069d8fe55b7a20756c04abcc9119bba.tar.bz2
scala-ee6fbae3d069d8fe55b7a20756c04abcc9119bba.zip
correctly fails implicit search for invalid implicit macros
There was a rare corner case when implicit search wouldn’t discard an invalid implicit macro (e.g. the one with mismatching macro impl or the one with macro impl defined in the same compilation run) during typechecking the corresponding candidate in typedImplicit1. This is now fixed.
Diffstat (limited to 'test/files/pos/macro-implicit-invalidate-on-error.scala')
-rw-r--r--test/files/pos/macro-implicit-invalidate-on-error.scala28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/files/pos/macro-implicit-invalidate-on-error.scala b/test/files/pos/macro-implicit-invalidate-on-error.scala
new file mode 100644
index 0000000000..22cd2d34b4
--- /dev/null
+++ b/test/files/pos/macro-implicit-invalidate-on-error.scala
@@ -0,0 +1,28 @@
+package scala.reflect
+package api
+
+import scala.language.experimental.macros
+import scala.reflect.macros.Context
+
+trait Liftable[T] {
+ def apply(universe: api.Universe, value: T): universe.Tree
+}
+
+object Liftable {
+ implicit def liftCaseClass[T <: Product]: Liftable[T] = macro liftCaseClassImpl[T]
+
+ def liftCaseClassImpl[T: c.WeakTypeTag](c: Context): c.Expr[Liftable[T]] = {
+ import c.universe._
+ val tpe = weakTypeOf[T]
+ if (!tpe.typeSymbol.asClass.isCaseClass) c.abort(c.enclosingPosition, "denied")
+ val p = List(q"Literal(Constant(1))")
+ c.Expr[Liftable[T]] { q"""
+ new scala.reflect.api.Liftable[$tpe] {
+ def apply(universe: scala.reflect.api.Universe, value: $tpe): universe.Tree = {
+ import universe._
+ Apply(Select(Ident(TermName("C")), TermName("apply")), List(..$p))
+ }
+ }
+ """ }
+ }
+}