From 9ad98963d092d91ca3da6dc7fcc935c386f49a74 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Fri, 28 Sep 2012 20:39:53 -0700 Subject: Fix for SI-6447, macro dependent type propagation. It really pays not to write new TypeMaps unless it is absolutely necessary, because there are about 1000 ways to get them wrong. I'm 98% sure this one can be dropped. Review by @xeno-by. --- src/compiler/scala/tools/nsc/typechecker/Macros.scala | 2 +- test/files/pos/t6447.scala | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/files/pos/t6447.scala diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala index bcc37e8b37..db3c133ee1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala @@ -315,7 +315,7 @@ trait Macros extends scala.tools.reflect.FastTrack with Traces { case _ => pre } - TypeRef(pre1, sym, args map mapOver) + typeRef(apply(pre1), sym, mapOverArgs(args, sym.typeParams)) case _ => mapOver(tp) } diff --git a/test/files/pos/t6447.scala b/test/files/pos/t6447.scala new file mode 100644 index 0000000000..1c0c0f2a31 --- /dev/null +++ b/test/files/pos/t6447.scala @@ -0,0 +1,18 @@ +import scala.language.experimental.macros +import scala.reflect.macros.Context + +class X { type T } + +object X { + // this works + def foo(x: X): x.T = macro fooImpl + def fooImpl(c: Context)(x: c.Expr[X]): c.Expr[x.value.T] = ??? + + // this doesn't + def bar(x: X, y: X): (x.T, y.T) = macro barImpl + def barImpl(c: Context)(x: c.Expr[X], y: c.Expr[X]): c.Expr[(x.value.T, y.value.T)] = ??? + + // neither does this + def baz(x: X)(xs: List[x.T]): Unit = macro bazImpl + def bazImpl(c: Context)(x: c.Expr[X])(xs: c.Expr[List[x.value.T]]): c.Expr[Unit] = ??? +} -- cgit v1.2.3