// See also pos/override-object-yes.scala

package case1 {
  // Missing interface in overriding object
  class Bippy { def f = 1 }
  trait Bippo

  trait Foo {
    object Bar extends Bippy with Bippo { override def f = 2 }
    def f(x: Bippo)
    def g = f(Bar)
  }
  trait Foo2 extends Foo {
    override object Bar extends Bippy {  // err
      override def f = 3
    }
  }

  // type mismatch in member
  trait Quux1 { object Bar { def g = 55 } }
  trait Quux2 extends Quux1 { override object Bar { def g = "abc" } } // err

  // still can't override final objects!
  trait Quux3 { final object Bar { } }
  trait Quux4 extends Quux3 { override object Bar  } // err
}

// type parameter as-seen-from business
package case2 {
  // invariance (see pos for the covariant case)
  class Bar[T]

  class Foo[T] {
    object A extends Bar[T]
  }

  class Baz[S] extends Foo[S] {
    override object A extends Bar[S]
  }

  class P1 extends Foo[Traversable[String]]
  class P2 extends P1 {
    override object A extends Bar[List[String]]  // err
  }
}

// Both overridden and overriding members must be objects, not vals with a module type
object SI9574 {
  object Foo
  object Bar
  trait A { def x: Foo.type }
  trait B extends A { def x: Bar.type } // should not compile (scala/bug#9574)
  trait C extends A { override object x }
  trait D { object x; def y = x }
  trait E extends D { override val x: super.x.type = y } // OK but doesn't need object subtyping exception
}
