summaryrefslogtreecommitdiff
path: root/test/files/run/t3994.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-03-13 11:01:37 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-03-13 11:21:59 +0100
commit2b5fde7ef9b202e8d4ba94d93d1b91b90e14d42f (patch)
tree4429c38d56b7de2e740913bf829cd84db863d300 /test/files/run/t3994.scala
parent52adf130409df57fd612a119e352345cf1c93979 (diff)
downloadscala-2b5fde7ef9b202e8d4ba94d93d1b91b90e14d42f.tar.gz
scala-2b5fde7ef9b202e8d4ba94d93d1b91b90e14d42f.tar.bz2
scala-2b5fde7ef9b202e8d4ba94d93d1b91b90e14d42f.zip
SI-7242 Fix crash when inner object mixes in its companion
Given: class C { trait T { C.this } // C$T$$$outer$ : C object T extends T { C.this } // C$T$$$outer$ : C.this.type } object T ended up with a definitions for both of the accessors. These cannot co-exist, as they have the same erased type. A crash ensued almost immediately in explitouter. Fortunately, the solution is straightforward: we can just omit the mixin outer accessor altogether, the objects own outer accessor is compatible with it. scala> :javap C.T Compiled from "<console>" public interface C$T{ public abstract C C$T$$$outer(); } scala> :javap C.T$ Compiled from "<console>" public class C$T$ extends java.lang.Object implements C$T{ public C C$T$$$outer(); public C$T$(C); } I also added an assertion to give a better error message in case we find ourselves here again. Also includes tests from SI-3994, which I'll mark as a duplicate.
Diffstat (limited to 'test/files/run/t3994.scala')
-rw-r--r--test/files/run/t3994.scala20
1 files changed, 20 insertions, 0 deletions
diff --git a/test/files/run/t3994.scala b/test/files/run/t3994.scala
new file mode 100644
index 0000000000..0ee1d9d966
--- /dev/null
+++ b/test/files/run/t3994.scala
@@ -0,0 +1,20 @@
+trait T {
+ trait Default { def foo = this }
+ object Default extends Default
+}
+
+class Crash { // if you change this to a `trait` it keeps failing, though if it is an `object` it compiles just fine!
+ class Element
+
+ /* declare this as a class, and the crash goes away */
+ trait ElementOrdering extends Ordering[Element] {
+ def compare(a: Element, b: Element): Int = 0
+ }
+
+ implicit object ElementOrdering extends ElementOrdering
+}
+
+object Test extends App {
+ (new T {}).Default
+ (new Crash).ElementOrdering
+}