summaryrefslogtreecommitdiff
path: root/test/files/run/delambdafy-dependent-on-param-subst-2.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-23 09:45:19 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-11-23 09:53:28 +0100
commit736613ea8a2fb3eede9bc01346a743c70b44eeaa (patch)
treef5edd5ee810a9a899be25c1412ba96df02a486a6 /test/files/run/delambdafy-dependent-on-param-subst-2.scala
parentcb37548ef85d471951867b9f8a97cb9b9820fc66 (diff)
downloadscala-736613ea8a2fb3eede9bc01346a743c70b44eeaa.tar.gz
scala-736613ea8a2fb3eede9bc01346a743c70b44eeaa.tar.bz2
scala-736613ea8a2fb3eede9bc01346a743c70b44eeaa.zip
Substitute new parameter symbols into lambda body
Previously, new synthetic parameter symbols were created for the apply method parameters, but only used in its `MethodType`. The `ValDef` trees of the function, along with their symbols, were used directly as the parameter trees of the apply method. % cat sandbox/test.scala object Test { (x: Int) => { (y: Int) => ??? } } % scalac-hash v2.10.3 -Xprint:typer,uncurry -uniqid ../scala2/sandbox/test.scala | egrep 'syntax|\bx' [info] v2.10.3 => /Users/jason/usr/scala-v2.10.3-0-g88b5d19 [[syntax trees at end of typer]] // test.scala ((x#12152: Int#351) => x#12152)#12151 [[syntax trees at end of uncurry]] // test.scala final def apply#15952(x#12152: Int#351): Int#351 = x#12152 This approach dates back a long way: c64152bc3. @odersky tells me it was most likely due to insufficent substitution/cloning machinery at the time. % qbin/scalac -Xprint:typer,uncurry -uniqid ../scala2/sandbox/test.scala | egrep 'syntax|\bx' [[syntax trees at end of typer]] // test.scala ((x#13685: Int#1760) => x#13685)#13671 [[syntax trees at end of uncurry]] // test.scala final def apply#13959(x#13960: Int#1760): Int#1760 = x#13960 To make this work, I had to fix a problem in symbol substition; this was commited in the previous commit. In the enclosed test, at Uncurry, the symbol of the nested class `N` had a `ClassInfoType`, which listed as a parent `M[a.C]`. When we substituted the new method parameter symbol `a` for the eponymous function parameter symbol, this was not touched.
Diffstat (limited to 'test/files/run/delambdafy-dependent-on-param-subst-2.scala')
-rw-r--r--test/files/run/delambdafy-dependent-on-param-subst-2.scala20
1 files changed, 20 insertions, 0 deletions
diff --git a/test/files/run/delambdafy-dependent-on-param-subst-2.scala b/test/files/run/delambdafy-dependent-on-param-subst-2.scala
new file mode 100644
index 0000000000..7b6fc597e8
--- /dev/null
+++ b/test/files/run/delambdafy-dependent-on-param-subst-2.scala
@@ -0,0 +1,20 @@
+trait M[-X] {
+ def m(x: X): Boolean
+}
+
+class C
+class A { class C }
+
+object Test {
+ def main(args: Array[String]) {
+ val a = new A
+
+ // class O extends M[a.C] { def m(x: a.C) = true }
+ // (new O: M[Null]).m(null) // Okay
+
+ ((a: A) => {
+ class N extends M[a.C] { def m(x: a.C) = true }
+ new N: M[Null]
+ }).apply(a).m(null) // NPE, missing bridge
+ }
+}