| // 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. |
| |
| import "package:expect/expect.dart"; |
| |
| // Test of parameterized types with invalid bounds. |
| |
| abstract class J<T> {} |
| |
| abstract class K<T> {} |
| |
| abstract class I< |
| T |
| extends num //# 00: continued |
| extends num //# 01: continued |
| extends num //# 02: continued |
| extends num //# 03: continued |
| extends num //# 04: continued |
| extends num //# 05: continued |
| extends num //# 06: continued |
| > {} |
| |
| class A<T> implements I<T>, J<T> {} |
| |
| main() { |
| var a = new A<String>(); |
| |
| { |
| I i = a; // //# 00: dynamic type error, static type warning |
| J j = a; // //# 01: static type warning |
| K k = a; // //# 02: dynamic type error, static type warning |
| |
| // In production mode, A<String> is subtype of I, error in checked mode. |
| var x = a is I; // //# 03: dynamic type error, static type warning |
| |
| // In both production and checked modes, A<String> is a subtype of J. |
| Expect.isTrue(a is J); // //# 04: static type warning |
| |
| // In both production and checked modes, A<String> is not a subtype of K. |
| // However, while unsuccessfully trying to prove that A<String> is a K, |
| // a malformed type is encountered in checked mode, resulting in a dynamic |
| // type error. |
| Expect.isTrue(a is !K); // //# 05: dynamic type error, static type warning |
| } |
| |
| a = new A<int>(); |
| |
| { |
| I i = a; |
| J j = a; |
| K k = a; // //# 06: dynamic type error, static type warning |
| |
| // In both production and checked modes, A<int> is a subtype of I. |
| Expect.isTrue(a is I); |
| |
| // In both production and checked modes, A<int> is a subtype of J. |
| Expect.isTrue(a is J); |
| |
| // In both production and checked modes, A<int> is not a subtype of K. |
| Expect.isTrue(a is! K); |
| } |
| } |