diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2016-03-30 17:17:34 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2016-03-30 20:07:34 -0700 |
commit | 8e32d00e1679114ee1b3f9a90f235d2ab9feba2e (patch) | |
tree | b7bb9f449797b561baf0a10a7eab004f01a8cf24 /test | |
parent | 7025be9a468419ca6076d78f8da32c6a667fc829 (diff) | |
download | scala-8e32d00e1679114ee1b3f9a90f235d2ab9feba2e.tar.gz scala-8e32d00e1679114ee1b3f9a90f235d2ab9feba2e.tar.bz2 scala-8e32d00e1679114ee1b3f9a90f235d2ab9feba2e.zip |
Keep Function when CBN arg thunk targets a SAM
The body of `def delay[T](v: => T) = (v _): F0[T]`
becomes `() => v` during `typedEta`, and then uncurry
considers whether to strip the function wrapper since
`v` is known to be a `Function0` thunk. Stripping is sound
when the expected type is `Function0` for this expression,
but that's no longer a given, since we could be expecting any
nullary SAM.
Also sweep up a bit around `typedEta`.
Encapsulate the, erm, creative encoding of
`m _` as `Typed(m, Function(Nil, EmptyTree))`.
Diffstat (limited to 'test')
-rw-r--r-- | test/files/run/sammy_cbn.scala | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/test/files/run/sammy_cbn.scala b/test/files/run/sammy_cbn.scala new file mode 100644 index 0000000000..b84b2fd8e5 --- /dev/null +++ b/test/files/run/sammy_cbn.scala @@ -0,0 +1,9 @@ +trait F0[T] { def apply(): T } + +object Test extends App { + def delay[T](v: => T) = (v _): F0[T] + + // should not fail with ClassCastException: $$Lambda$6279/897871870 cannot be cast to F0 + // (also, should not say boe!) + delay(println("boe!")) +} |