| // Copyright (c) 2019, 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() { |
| // Ensure all classes are used. |
| final l = <dynamic>[Base(), A<int>(), B<int>(), I<int>()]; |
| print(l); |
| |
| // Call `add(T)` with `T = A<int/String>` (the VM will not generate an |
| // optimized TTS for `A<int>` because there's two classes implementing |
| // `A`, both have type argument vector at a different offset, so it wouldn't |
| // know where to load it from) |
| |
| // Populate the SubtypeTestCache with successfull `add(I<String>())`. |
| final x = <dynamic>[<A<String>>[]]; |
| x.single.add(I<String>()); |
| |
| // Ensure type check fails if list type is now `A<int>`. |
| final y = <dynamic>[<A<int>>[]]; |
| String exception = ''; |
| try { |
| y.single.add(I<String>()); |
| } catch (e) { |
| exception = e.toString(); |
| } |
| print(exception); |
| Expect.isTrue(exception.contains('is not a subtype of')); |
| } |
| |
| // Ensure depth-first preorder cid numbering will have the cid for [A] in the |
| // middle and ensure type argument vector will be second field. |
| class Base { |
| final int baseField = int.parse('1'); |
| } |
| |
| class A<T> extends Base { |
| T foo(T arg) => arg; |
| } |
| |
| class B<T> extends A<T> {} |
| |
| // Make another implementation of A<T> where type argument vector is first |
| // field. |
| class I<T> implements A<T> { |
| int get baseField => int.parse('2'); |
| T foo(T arg) => arg; |
| } |