summaryrefslogtreecommitdiff
path: root/test/files/pos/t9050.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-01-16 13:25:31 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-01-16 13:47:37 +1000
commit286dafbd45caa2b85f8113845105aaaec98be71a (patch)
tree46310ed939fe054c5b4f7cb47f0e89a8554eb5e0 /test/files/pos/t9050.scala
parent3d76836bc81c3ec183e83ee186e447ff212507d0 (diff)
downloadscala-286dafbd45caa2b85f8113845105aaaec98be71a.tar.gz
scala-286dafbd45caa2b85f8113845105aaaec98be71a.tar.bz2
scala-286dafbd45caa2b85f8113845105aaaec98be71a.zip
SI-9050 Fix crasher with value classes, recursion
From the "Substitution is hard to do" department. In 7babdab9a, TreeSymSubstitutor was modified to mutate the info of symbols defined in the tree, if that symbol's info referred to one of the `from` symbols in the substitution. It would have been more principled to create a cloned symbol with the updated info, and add that to the substitution. But I wasn't able implement that correctly (let alone efficiently.) The in-place mutation of the info of a symbol led to the crasher in this bug: a singleton type over that symbol ends up with a stale cached value of 'underlying'. In the enclosed test case, this leads to a type error in the `SubstituteRecursion` of the extension methods phase. This commit performs a cleanup job at the end of `substituteSymbols` by invalidating the cache of any `SingleType`-s in the tree that refer to one of the mutated symbols.
Diffstat (limited to 'test/files/pos/t9050.scala')
-rw-r--r--test/files/pos/t9050.scala13
1 files changed, 13 insertions, 0 deletions
diff --git a/test/files/pos/t9050.scala b/test/files/pos/t9050.scala
new file mode 100644
index 0000000000..b1ab09f901
--- /dev/null
+++ b/test/files/pos/t9050.scala
@@ -0,0 +1,13 @@
+final class Mu[F](val value: Any) extends AnyVal {
+ def cata(f: F) {
+ // crash
+ ((y: Mu[F]) => y.cata(f))
+ // crash
+ def foo(x : Mu[F]) = x.cata(f)
+
+ // // okay
+ def x: Mu[F] = ???
+ (() => x.cata(f))
+ assert(true, cata(f))
+ }
+}