Index: tests/language/src/CyclicTypeVariableTest.dart |
diff --git a/tests/language/src/CyclicTypeVariableTest.dart b/tests/language/src/CyclicTypeVariableTest.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d842252707d6df59d25a3e4e89a94320d532e6b2 |
--- /dev/null |
+++ b/tests/language/src/CyclicTypeVariableTest.dart |
@@ -0,0 +1,61 @@ |
+// 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 error |
+>(T arg); |
+ |
+class DerivedFunc extends Base<funcType<DerivedFunc>> { } |
+ |
+ |
+interface A<S |
+extends S /// 02: static type error |
+> { |
+ S field; |
+} |
+ |
+interface B<U extends Base<U>> { // legal |
+ U field; |
+} |
+ |
+class C1<V |
+extends V /// 03: static type error |
+> { |
+ V field; |
+} |
+ |
+class C2<V |
+extends V /// 04: static type 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; |
+} |