aboutsummaryrefslogblamecommitdiff
path: root/tests/pos/i1047.scala
blob: 0f9b54135f6eb52d52de6758bb5c5aa8c4e80333 (plain) (tree)






























                                                                               
package hello

object world extends App {
  println("hello dotty!")

  trait AnimalPackage {
    type Animal <: AnimalU
    type AnimalU = { val age: Int }
    def newAnimal(a: AnimalU): Animal
    def newSubAnimal[T](a: AnimalU & T): Animal & T
  }
  val p: AnimalPackage = new AnimalPackage { p =>
    type Animal = AnimalU
    override def newAnimal(a: AnimalU): Animal = a
    override def newSubAnimal[T](a: AnimalU & T): Animal & T = a
  }
  val lambda: p.Animal = p.newAnimal(new { val age = 1 })
  trait CatPackage { pc =>
    type Cat <: p.Animal & pc.CatDelta
    type CatDelta = { val meow: Int }
    type CatU = p.AnimalU & pc.CatDelta
    def newCat(c: CatU): Cat
    def newSubCat[T](c: CatU & T): Cat & T
  }
  val pc: CatPackage = new CatPackage { pc =>
    type Cat = p.Animal & pc.CatDelta
    def newCat(c: CatU): Cat = p.newSubAnimal[pc.CatDelta](c)
    def newSubCat[T](c: CatU & T): Cat & T = p.newSubAnimal[pc.CatDelta & T](c)
  }
  val felix: pc.Cat = pc.newCat(new { val age = 1; val meow = 2 })
}