aboutsummaryrefslogtreecommitdiff
path: root/tests/patmat/t9657.scala
diff options
context:
space:
mode:
Diffstat (limited to 'tests/patmat/t9657.scala')
-rw-r--r--tests/patmat/t9657.scala62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/patmat/t9657.scala b/tests/patmat/t9657.scala
new file mode 100644
index 000000000..f9769574e
--- /dev/null
+++ b/tests/patmat/t9657.scala
@@ -0,0 +1,62 @@
+sealed trait PowerSource
+
+case object Petrol extends PowerSource
+
+case object Pedal extends PowerSource
+
+sealed abstract class Vehicle {
+ type A <: PowerSource
+}
+
+case object Bicycle extends Vehicle {
+ type A = Pedal.type
+}
+
+case class Bus(fuel: Int) extends Vehicle {
+ type A = Petrol.type
+}
+
+case class Car(fuel: Int) extends Vehicle {
+ type A = Petrol.type
+}
+
+class Test {
+ def refuel[P <: Petrol.type](vehicle: Vehicle {type A = P} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ case Bus(_) => Bus(100)
+ }
+
+ def refuel2[P <: Petrol.type](vehicle: Vehicle {type A = P} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ }
+
+ def foo1(vehicle: Vehicle {type A <: Petrol.type} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ case Bus(_) => Bus(100)
+ }
+
+ def foo2(vehicle: Vehicle {type A <: Petrol.type} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ }
+
+ type P = Petrol.type
+
+ def bar1(vehicle: Vehicle {type A <: P} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ case Bus(_) => Bus(100)
+ }
+
+ def bar2(vehicle: Vehicle {type A <: P} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ }
+
+ def qux1[P <: Petrol.type](vehicle: Vehicle {type A <: P} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ case Bus(_) => Bus(100)
+ }
+
+ def qux2[P <: Petrol.type](vehicle: Vehicle {type A <: P} ): Vehicle = vehicle match {
+ case Car(_) => Car(100)
+ }
+
+}