blob: f3c2de28227436f8df128166c06e9d7836523567 [file] [log] [blame]
// 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);
}
}