// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

// Tests cyclic reference to type variables in type expressions

class Base<T> {}

class Derived extends Base<Derived> {} // legal

typedef void funcType<
    T
extends T //# 01: compile-time error
    >(T arg);

class DerivedFunc extends Base<funcType<DerivedFunc>> {}

abstract class A<
    S
extends S //# 02: compile-time error
    > {
  S field;
}

abstract class B<U extends Base<U>> {
  // legal
  U field;
}

class C1<
    V
extends V // //# 03: compile-time error
    > {
  V field;
}

class C2<
    V
extends V // //# 04: compile-time error
    > implements A<V> {
  V field;
}

class D1<W extends Base<W>> {
  // legal
  W field;
}

class D2<W extends Base<W>> implements B<W> {
  //   legal
  W field;
}

class E<X extends Base<funcType<X>>> {
  // legal

  X field;
}

main() {
  new C1<int>();
  new C2<int>();
  new D1<Derived>();
  new D2<Derived>();
  new E<DerivedFunc>();
  funcType<Object> val = null;
}
