|  | // Copyright (c) 2024, 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'; | 
|  |  | 
|  | main() { | 
|  | test1(); | 
|  | test2(); | 
|  | test3(); | 
|  | test4(); | 
|  | test5(); | 
|  | test6(); | 
|  | test7(); | 
|  |  | 
|  | X<double>(); | 
|  | X<int>().test1(); | 
|  | X<int>().test2(); | 
|  | } | 
|  |  | 
|  | final bool kTrue = int.parse('1') == 1; | 
|  |  | 
|  | void test1() { | 
|  | final B0<int> a = kTrue ? B2<String>() : B1<bool, bool>(); | 
|  | Expect.isFalse(a is B2<int>); | 
|  | Expect.isTrue(a is B2<String>); | 
|  | } | 
|  |  | 
|  | void test2() { | 
|  | final B1<num, num> a = kTrue | 
|  | ? (B1<int, double>() as B1<num, num>) | 
|  | : (B2<double>() as B1<num, num>); | 
|  | Expect.isFalse(a is B2<int>); | 
|  | Expect.isFalse(a is B2<double>); | 
|  | Expect.isFalse(a is B2<num>); // Should be optimized to cid-range check. | 
|  | } | 
|  |  | 
|  | void test3() { | 
|  | final B1<int, num> a = | 
|  | kTrue ? (B1<int, double>() as B1<int, num>) : (B2<int>() as B1<int, num>); | 
|  | Expect.isFalse(a is B2<int>); | 
|  | Expect.isFalse(a is B2<double>); | 
|  | Expect.isFalse(a is B2<num>); | 
|  | } | 
|  |  | 
|  | void test4() { | 
|  | final B1<num, num> a = kTrue ? B2<int>() : B1<num, num>(); | 
|  | Expect.isTrue(a is B2<num>); // Should be optimized to cid-range check. | 
|  | Expect.isTrue(a is B2<int>); | 
|  | Expect.isFalse(a is B2<double>); | 
|  | } | 
|  |  | 
|  | void test5() { | 
|  | final B1<int, num> a = kTrue ? B2<int>() : B1<int, num>(); | 
|  | Expect.isTrue(a is B2<num>); | 
|  | Expect.isTrue(a is B2<int>); | 
|  | Expect.isFalse(a is B2<double>); | 
|  | } | 
|  |  | 
|  | void test6() { | 
|  | final B1<int, int> a = kTrue ? B2<int>() : B1<int, int>(); | 
|  | Expect.isTrue(a is B2<num>); // Should be optimized to cid-range check. | 
|  | Expect.isTrue(a is B2<int>); // Should be optimized to cid-range check. | 
|  | Expect.isFalse(a is B2<double>); | 
|  | } | 
|  |  | 
|  | void test7() { | 
|  | final B1<List<int>, List<int>> a = | 
|  | kTrue ? B2<List<int>>() : B1<List<int>, List<int>>(); | 
|  | Expect.isTrue(a is B2<List<num>>); // Should be optimized to cid-range check. | 
|  | Expect.isTrue(a is B2<List<int>>); // Should be optimized to cid-range check. | 
|  | Expect.isFalse(a is B2<List<double>>); | 
|  | } | 
|  |  | 
|  | class X<T extends num> { | 
|  | void test1() { | 
|  | final B1<T, T> a = kTrue ? B2<T>() : B1<T, T>(); | 
|  | Expect.isTrue(a is B2<T>); // Should be optimized to cid-range check. | 
|  | Expect.isTrue(a is B2<int>); | 
|  | Expect.isFalse(a is B2<double>); | 
|  | } | 
|  |  | 
|  | void test2() { | 
|  | final B1<List<T>, List<T>> a = | 
|  | kTrue ? B2<List<T>>() : B1<List<T>, List<T>>(); | 
|  | Expect.isTrue(a is B2<List<T>>); // Should be optimized to cid-range check. | 
|  | Expect.isTrue( | 
|  | a is B2<List<num>>); // Should be optimized to cid-range check. | 
|  | Expect.isTrue(a is B2<List<int>>); | 
|  | Expect.isFalse(a is B2<List<double>>); | 
|  | } | 
|  | } | 
|  |  | 
|  | class B0<T> {} | 
|  |  | 
|  | class B1<T, H> extends B0<int> {} | 
|  |  | 
|  | class B2<T> extends B1<T, T> {} |