From ee6fbae3d069d8fe55b7a20756c04abcc9119bba Mon Sep 17 00:00:00 2001 From: Eugene Burmako Date: Thu, 14 Nov 2013 12:17:07 +0100 Subject: correctly fails implicit search for invalid implicit macros MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../pos/macro-implicit-invalidate-on-error.check | 0 .../pos/macro-implicit-invalidate-on-error.scala | 28 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/files/pos/macro-implicit-invalidate-on-error.check create mode 100644 test/files/pos/macro-implicit-invalidate-on-error.scala (limited to 'test/files/pos') diff --git a/test/files/pos/macro-implicit-invalidate-on-error.check b/test/files/pos/macro-implicit-invalidate-on-error.check new file mode 100644 index 0000000000..e69de29bb2 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)) + } + } + """ } + } +} -- cgit v1.2.3