summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-09-28 20:39:53 -0700
committerPaul Phillips <paulp@improving.org>2012-09-28 20:56:08 -0700
commit9ad98963d092d91ca3da6dc7fcc935c386f49a74 (patch)
tree0b8c6fc49ea0eb0c2df8cbc79669efd582c2e8c8
parentdea6c342da2ed9c297e40a00625b819e9452c1b5 (diff)
downloadscala-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.scala2
-rw-r--r--test/files/pos/t6447.scala18
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] = ???
+}