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