| /* |
| * Copyright (c) 2018, 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. |
| */ |
| /** |
| * @assertion We say that the parameterized type G<T1..Tk> is regular-bounded |
| * when Tj <: [T1/X1 .. Tk/Xk]Bj for all j, 1 <= j <= k, where X1..Xk are the |
| * formal type parameters of G in declaration order, and B1..Bk are the |
| * corresponding upper bounds. |
| * This means that each actual type argument satisfies the declared upper bound |
| * for the corresponding formal type parameter. |
| * We extend covariance for generic class types such that it can be used also in |
| * cases where a type argument violates the corresponding bound. |
| * For instance, assuming the classes [C] and [D] as declared in the |
| * [Motivation] section, [C<D>] is a subtype of [C<Object>]. This is new because |
| * [C<Object>] used to be a compile-time error, which means that no questions |
| * could be asked about its properties. Note that this is a straightforward |
| * application of the usual covariance rule: [C<D> <: C<Object>] because |
| * [D <: Object]. We need this relaxation of the rules in order to be able to |
| * define which violations of the declared bounds are admissible. |
| * @description Checks that assigning [dynamic] as a bound of super-bounded type |
| * does not cause compile error in case of several type parameters. |
| * @author iarkh@unipro.ru |
| * @issue #32903 |
| */ |
| |
| class C<X extends C<X, int>, int> {} |
| class D extends C<D, int> {} |
| |
| class E<String, X extends E<String, X, double, int>, double, int> {} |
| class F extends E<String, F, double, int> {} |
| |
| main() { |
| D d = new D(); |
| C<dynamic, int> c = d; |
| C<dynamic, dynamic> c1 = d; |
| dynamic c2 = d; |
| |
| F f = new F(); |
| E<String, dynamic, double, int> e = f; |
| E<dynamic, dynamic, dynamic, dynamic> e1 = f; |
| dynamic e2 = f; |
| } |