diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-12-13 10:37:44 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-12-15 22:18:10 +0100 |
commit | 6a4947c45c0b5fac3297da320b9627069a7b5ac4 (patch) | |
tree | 28f6e71a1dbf9043a5fd4bb69f87f2f383c618da /test/files/run/t8017.flags | |
parent | fcf1adad75553d25ea4e6afe37c971902b11f35e (diff) | |
download | scala-6a4947c45c0b5fac3297da320b9627069a7b5ac4.tar.gz scala-6a4947c45c0b5fac3297da320b9627069a7b5ac4.tar.bz2 scala-6a4947c45c0b5fac3297da320b9627069a7b5ac4.zip |
SI-8017 Value class awareness for -Ydelamdafy:method
The delambdafy creates a bridge method which requires adaptation
of the result type to the generic `Object`, which is the erased
return type of FunctionN.
This bridge building reused some code from erasure, now refactored
into TypeAdaptingTransformer.
But, it was running into problems with:
class C(a: Int) extends AnyVal
(x: Any) => new C(0)
It created (forgive the pseudo quasiquote syntax):
class anonfun$ extends Function1[Any, C] {
def apply#1(a: Object): Int = 0
<bridge> def apply#2(a: Object): Object = {
val result: Int = apply#1(a)
${adapt(Ident("result"), ObjectType)}
}
}
This resulted in primitive boxing, rather than value class boxing.
Instead, we need the call to the main apply method to be typed
as `ErasedValueClass(C, Int)`, which `adapt` takes as a trigger
to perform value class boxing.
Finally, we have to run the post-erasure transformer over the adapted
tree to eliminate remnants of `ErasedValueClass` from the types of
trees.
Diffstat (limited to 'test/files/run/t8017.flags')
-rw-r--r-- | test/files/run/t8017.flags | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/test/files/run/t8017.flags b/test/files/run/t8017.flags new file mode 100644 index 0000000000..48b438ddf8 --- /dev/null +++ b/test/files/run/t8017.flags @@ -0,0 +1 @@ +-Ydelambdafy:method |