diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-01-05 22:41:51 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-01-06 15:25:32 +0100 |
commit | 2c770ae31a71d5beece4753ce4d43265036ee477 (patch) | |
tree | db0bceb8734844cee8dd5bbc6fedf8c43ca2d0f1 /test | |
parent | 370d6d618884b886590ac8aa7f22a85cca45430a (diff) | |
download | scala-2c770ae31a71d5beece4753ce4d43265036ee477.tar.gz scala-2c770ae31a71d5beece4753ce4d43265036ee477.tar.bz2 scala-2c770ae31a71d5beece4753ce4d43265036ee477.zip |
SI-8111 Repair symbol owners after abandoned named-/default-args
Names/Defaults eagerly transforms an application with temporaries
to maintain evaluation order, and dutifully changes owners of
symbols along the way.
However, if this approach doesn't work out, we throw away this
and try a auto-tupling. However, we an still witness symbols
owned by the temporaries.
This commit records which symbols are owned by the context.owner
before `transformNamedApplication`, and rolls back the changes
before `tryTupleApply`.
Perhaps a better approach would be to separate the names/defaults
applicability checks from the evaluation-order-preserving transform,
and only call the latter after we have decided to go that way.
Diffstat (limited to 'test')
-rw-r--r-- | test/files/pos/t8111.scala | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/test/files/pos/t8111.scala b/test/files/pos/t8111.scala new file mode 100644 index 0000000000..0d63a16ba4 --- /dev/null +++ b/test/files/pos/t8111.scala @@ -0,0 +1,24 @@ +trait T { + + def crashy(ma: Any) { + // okay + val f1 = (u: Unit) => ma + foo(f1)() + foo((u: Unit) => ma) + foo(0, (u: Any) => ma) apply () + + // crash due to side effects on the onwer of the symbol in the + // qualifier or arguments of the application during an abandoned + // names/defaults transform. The code type checkes because of + // autp-tupling which promotes and empty parmater list to `(): Unit` + foo((u: Any) => ma)() + + {{(u: Any) => ma}; this}.foo(0)() + + foo({def foo = ma; 0})() + + {def foo = ma; this}.foo(0)() + } + + def foo(f: Any): Any => Any +} |