aboutsummaryrefslogtreecommitdiff
path: root/tests/pos/approximateUnion.scala
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pos/approximateUnion.scala')
-rw-r--r--tests/pos/approximateUnion.scala96
1 files changed, 96 insertions, 0 deletions
diff --git a/tests/pos/approximateUnion.scala b/tests/pos/approximateUnion.scala
new file mode 100644
index 000000000..c3fe0e162
--- /dev/null
+++ b/tests/pos/approximateUnion.scala
@@ -0,0 +1,96 @@
+object approximateUnion {
+
+ trait C[+T]
+ trait D
+ trait E
+ trait X[-T]
+
+ {
+ trait A extends C[A] with D
+ trait B extends C[B] with D
+
+ val coin = true
+ val x = if (coin) new A else new B
+ val y = Some(if (coin) new A else new B)
+
+ val xtest: C[A | B] & D = x
+ val ytest: Some[C[A | B] & D] = y
+ }
+
+ {
+ trait A extends C[X[A]] with D
+ trait B extends C[X[B]] with D with E
+
+ val coin = true
+ val x = if (coin) new A else new B
+ val y = Some(if (coin) new A else new B)
+
+ val xtest: C[X[A & B]] & D = x
+ val ytest: Some[C[X[A & B]] & D] = y
+ }
+}
+
+object approximateUnion2 {
+
+ trait C[T]
+ trait D
+ trait E
+ trait X[-T]
+
+ {
+ trait A extends C[A] with D
+ trait B extends C[B] with D
+
+ val coin = true
+ val x = if (coin) new A else new B
+ val y = Some(if (coin) new A else new B)
+
+ val xtest: C[_ >: A & B <: A | B] & D = x
+ val ytest: Some[C[_ >: A & B <: A | B] & D] = y
+ }
+
+ {
+ trait A extends C[X[A]] with D
+ trait B extends C[X[B]] with D with E
+
+ val coin = true
+ val x = if (coin) new A else new B
+ val y = Some(if (coin) new A else new B)
+
+ val xtest: C[_ >: X[A | B] <: X[A & B]] & D = x
+ val ytest: Some[C[_ >: X[A | B] <: X[A & B]]] = y
+ }
+}
+
+object approximateUnion3 {
+
+ trait C[-T]
+ trait D
+ trait E
+ trait X[-T]
+
+ {
+ trait A extends C[A] with D
+ trait B extends C[B] with D
+
+ val coin = true
+ val x = if (coin) new A else new B
+ val y = Some(if (coin) new A else new B)
+
+ val xtest: C[A & B] & D = x
+ val ytest: Some[C[A & B] & D] = y
+ }
+
+ {
+ trait A extends C[X[A]] with D
+ trait B extends C[X[B]] with D with E
+
+ val coin = true
+ val x = if (coin) new A else new B
+ val y = Some(if (coin) new A else new B)
+
+ val xtest: C[X[A | B]] & D = x
+ val ytest2: Some[C[X[A | B]] & D] = y
+ }
+}
+