aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2017-02-22 16:35:13 +0100
committerGuillaume Martres <smarter@ubuntu.com>2017-02-22 16:35:13 +0100
commit6eeb06facb4e0afca9b11b7859a929b31fc23f25 (patch)
tree428c7ecc2f07e85088d9afe615f2a804d487c4f5
parent8a826ee3d7a7a7230dea8cc1fa4f87b70e8efe81 (diff)
downloaddotty-6eeb06facb4e0afca9b11b7859a929b31fc23f25.tar.gz
dotty-6eeb06facb4e0afca9b11b7859a929b31fc23f25.tar.bz2
dotty-6eeb06facb4e0afca9b11b7859a929b31fc23f25.zip
Fix #2009: Fix placeholder params logic for lambdas (#2019)
* Fix #2009: Fix placeholder params logic for lambdas Logic was missing placeholders in rhs of lambdas. * Add comment * Fix typo
-rw-r--r--compiler/src/dotty/tools/dotc/parsing/Parsers.scala16
-rw-r--r--tests/pos/i2009.scala9
2 files changed, 18 insertions, 7 deletions
diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
index b46bc401d..c14108d2e 100644
--- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
+++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala
@@ -993,20 +993,22 @@ object Parsers {
else {
val saved = placeholderParams
placeholderParams = Nil
+
+ def wrapPlaceholders(t: Tree) = try
+ if (placeholderParams.isEmpty) t
+ else new WildcardFunction(placeholderParams.reverse, t)
+ finally placeholderParams = saved
+
val t = expr1(location)
if (in.token == ARROW) {
- placeholderParams = saved
- closureRest(start, location, convertToParams(t))
+ placeholderParams = Nil // don't interpret `_' to the left of `=>` as placeholder
+ wrapPlaceholders(closureRest(start, location, convertToParams(t)))
}
else if (isWildcard(t)) {
placeholderParams = placeholderParams ::: saved
t
}
- else
- try
- if (placeholderParams.isEmpty) t
- else new WildcardFunction(placeholderParams.reverse, t)
- finally placeholderParams = saved
+ else wrapPlaceholders(t)
}
}
diff --git a/tests/pos/i2009.scala b/tests/pos/i2009.scala
new file mode 100644
index 000000000..e2cf47203
--- /dev/null
+++ b/tests/pos/i2009.scala
@@ -0,0 +1,9 @@
+object Test {
+
+ trait Gen[T] {
+ def map[U](f: T => U): Gen[U] = ???
+ }
+
+ def f[T](implicit g: Gen[T]): Gen[() => T] =
+ g map ( () => _ )
+}