|  | // Copyright (c) 2015, 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. | 
|  | // SharedOptions=--supermixin | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | bool inCheckedMode() { | 
|  | try { | 
|  | var i = 42; | 
|  | String s = i; | 
|  | } on TypeError catch (e) { | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | class MS< | 
|  | U, | 
|  | V | 
|  | extends U //# 01: static type warning | 
|  | > {} | 
|  |  | 
|  | class M< | 
|  | U | 
|  | extends V //# 01: continued | 
|  | , | 
|  | V> extends MS<V, U> {} | 
|  |  | 
|  | class NS< | 
|  | U | 
|  | extends V //# 01: continued | 
|  | , | 
|  | V> {} | 
|  |  | 
|  | class N< | 
|  | U, | 
|  | V | 
|  | extends U //# 01: continued | 
|  | > extends NS<V, U> {} | 
|  |  | 
|  | class S<T> {} | 
|  |  | 
|  | class MNA<U, V, W> extends S<List<U>> | 
|  | with M<List<V>, List<U>>, N<List<W>, List<W>> {} | 
|  |  | 
|  | class MNA2<U, V, W> = S<List<U>> with M<List<W>, List<W>>, N<List<U>, List<V>>; | 
|  |  | 
|  | class MNA3<U, V, W> extends S<List<U>> | 
|  | with MNA<U, V, W>, MNA2<List<U>, List<V>, List<W>> {} | 
|  |  | 
|  | class MNA4<U, V, W> = S<List<U>> | 
|  | with MNA<U, V, W>, MNA2<List<U>, List<V>, List<W>>; | 
|  |  | 
|  | main() { | 
|  | new MNA<num, int, bool>(); | 
|  | new MNA2<num, int, bool>(); | 
|  | new MNA3<num, int, bool>(); | 
|  | new MNA4<num, int, bool>(); | 
|  | bool shouldThrow = false | 
|  | || inCheckedMode() //# 01: continued | 
|  | ; | 
|  | if (shouldThrow) { | 
|  | // Type parameter U of M must extend type parameter V, but | 
|  | // type argument List<num> is not a subtype of List<int>. | 
|  | Expect.throws(() => new MNA<int, num, bool>(), (e) => e is TypeError); | 
|  | // Type parameter V of N must extend type parameter U, but | 
|  | // type argument List<num> is not a subtype of List<int>. | 
|  | Expect.throws(() => new MNA2<int, num, bool>(), (e) => e is TypeError); | 
|  | // Type parameter V of N must extend type parameter U, but | 
|  | // type argument List<List<num>> is not a subtype of List<List<int>>. | 
|  | Expect.throws(() => new MNA3<int, num, bool>(), (e) => e is TypeError); | 
|  | // Type parameter V of N must extend type parameter U, but | 
|  | // type argument List<List<num>> is not a subtype of List<List<int>>. | 
|  | Expect.throws(() => new MNA4<int, num, bool>(), (e) => e is TypeError); | 
|  | } else { | 
|  | new MNA<int, num, bool>(); | 
|  | new MNA2<int, num, bool>(); | 
|  | new MNA3<int, num, bool>(); | 
|  | new MNA4<int, num, bool>(); | 
|  | } | 
|  | } |