| // 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: 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; |
| } |