// 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.

// 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: static type warning
>(T arg);

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


interface A<S 
extends S /// 02: static type warning
> {
  S field;
}

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

class C1<V 
extends V  /// 03: static type warning
> {
  V field;
}

class C2<V
extends V  /// 04: static type warning
> 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;
}
