summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2015-04-22 17:10:57 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2015-04-22 17:10:57 -0700
commit20f7389c4cb24e44c382b6d1e60e871eb5114173 (patch)
treee73cb854bc8b75a89b6a2b5f1c6a5caabc2e2e35 /test
parentba36c2bff4380be6f9cdf802b56b766d475fbea6 (diff)
parent2fbd539e353fd9d234f9a633d7606529d871d939 (diff)
downloadscala-20f7389c4cb24e44c382b6d1e60e871eb5114173.tar.gz
scala-20f7389c4cb24e44c382b6d1e60e871eb5114173.tar.bz2
scala-20f7389c4cb24e44c382b6d1e60e871eb5114173.zip
Merge pull request #4452 from lrytz/valueClassSelfTypeBCode
Don't crash GenBCode for value classes with a self declaration
Diffstat (limited to 'test')
-rw-r--r--test/files/run/valueClassSelfType.scala52
1 files changed, 52 insertions, 0 deletions
diff --git a/test/files/run/valueClassSelfType.scala b/test/files/run/valueClassSelfType.scala
new file mode 100644
index 0000000000..47a3764b0a
--- /dev/null
+++ b/test/files/run/valueClassSelfType.scala
@@ -0,0 +1,52 @@
+trait T
+
+class V1(val l: Long) extends AnyVal { self: T =>
+ def foo: V1 = self
+ def bar: T = self
+}
+
+class V2(val l: Long) extends AnyVal { self =>
+ def foo: V2 = self
+}
+
+class V3(val l: Long) extends AnyVal { self: Long =>
+ def foo: V3 = self
+ def bar: Long = self
+}
+
+// non-value classes
+
+class C1(val l: Long) { self: T =>
+ def foo: C1 = self
+ def bar: T = self
+}
+
+class C2(val l: Long) { self =>
+ def foo: C2 = self
+}
+
+class C3(val l: Long) { self: Long =>
+ def foo: C3 = self
+ def bar: Long = self
+}
+
+object Test extends App {
+ // Rejected: superclass V1 is not a subclass of the superclass Object of the mixin trait T
+ // new V1(1l) with T
+
+ assert(new V2(1l).foo.l == 1l)
+
+ // Rejected: V3 does not conform to its self-type V3 with Long
+ // new V3(1l)
+
+ val c2 = new C1(2l) with T
+ assert(c2.foo.l + c2.bar.asInstanceOf[C1].l == 4l)
+
+ assert(new C2(3l).foo.l == 3l)
+
+ // Rejected: C3 does not conform to its self-type C3 with Long
+ // new C3(4l)
+
+ // Rejected: class Long needs to be a trait to be mixed in
+ // new C3(4l) with Long
+}