diff options
author | Paul Phillips <paulp@improving.org> | 2012-09-28 20:39:53 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-09-28 20:56:08 -0700 |
commit | 9ad98963d092d91ca3da6dc7fcc935c386f49a74 (patch) | |
tree | 0b8c6fc49ea0eb0c2df8cbc79669efd582c2e8c8 | |
parent | dea6c342da2ed9c297e40a00625b819e9452c1b5 (diff) | |
download | scala-9ad98963d092d91ca3da6dc7fcc935c386f49a74.tar.gz scala-9ad98963d092d91ca3da6dc7fcc935c386f49a74.tar.bz2 scala-9ad98963d092d91ca3da6dc7fcc935c386f49a74.zip |
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.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Macros.scala | 2 | ||||
-rw-r--r-- | test/files/pos/t6447.scala | 18 |
2 files changed, 19 insertions, 1 deletions
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] = ??? +} |