summaryrefslogtreecommitdiff
path: root/test/files/pos/t8111.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-01-05 22:41:51 +0100
committerJason Zaugg <jzaugg@gmail.com>2014-01-06 15:25:32 +0100
commit2c770ae31a71d5beece4753ce4d43265036ee477 (patch)
treedb0bceb8734844cee8dd5bbc6fedf8c43ca2d0f1 /test/files/pos/t8111.scala
parent370d6d618884b886590ac8aa7f22a85cca45430a (diff)
downloadscala-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/files/pos/t8111.scala')
-rw-r--r--test/files/pos/t8111.scala24
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
+}