summaryrefslogtreecommitdiff
path: root/test/files/pos/existentials.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-02-11 13:16:06 -0800
committerPaul Phillips <paulp@improving.org>2012-02-11 23:05:22 -0800
commit7a6fa80937dec6c60efe53c915dfa3ba76b3af87 (patch)
tree76fbd019dfcb0caf284ba8f95bc2dfe962896506 /test/files/pos/existentials.scala
parentc478eb770ddf27de64d55426f0fdd3fd81d11f22 (diff)
downloadscala-7a6fa80937dec6c60efe53c915dfa3ba76b3af87.tar.gz
scala-7a6fa80937dec6c60efe53c915dfa3ba76b3af87.tar.bz2
scala-7a6fa80937dec6c60efe53c915dfa3ba76b3af87.zip
Another existential problem down.
There is a window of danger when multiple related elements are being typed where something which is conceptually one thing can slip into two things, and those two things can be incompatible with one another. Less mysteriously, c478eb770d fixed this: def f = { object Bob ; Bob } ; val g = f But, it did not fix this: def f = { case class Bob() ; Bob } ; val g = f See test case pos/existentials-harmful.scala for an "in the wild" code example fixed by this commit. The root of the problem was that the getter and the field would each independently derive the same existential type to describe Bob, but those existentials were not the same as one another. This has been the most elusive bug I have ever fixed. I want to cry when I think of how much time I've put into it over the past half decade or so. Unfortunately the way the repl works it is particularly good at eliciting those grotesque found/required error messages and so I was never able to let the thing go. There is still a cosmetic issue (from the last commit really) where compound types wind up with repeated parents. Closes SI-1195, SI-1201.
Diffstat (limited to 'test/files/pos/existentials.scala')
-rw-r--r--test/files/pos/existentials.scala9
1 files changed, 9 insertions, 0 deletions
diff --git a/test/files/pos/existentials.scala b/test/files/pos/existentials.scala
new file mode 100644
index 0000000000..c51f60b546
--- /dev/null
+++ b/test/files/pos/existentials.scala
@@ -0,0 +1,9 @@
+class A {
+ def f() = { case class Bob(); Bob }
+
+ val quux0 = f()
+ def quux1 = f()
+
+ val bippy0 = f _
+ def bippy1 = f _
+}