OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /*@testedFeatures=inference*/ | 5 /*@testedFeatures=inference*/ |
6 library test; | 6 library test; |
7 | 7 |
8 class A { | 8 class A { |
9 T f<T>(T t) => t; | 9 T f<T>(T t) => t; |
10 int g(dynamic i) => 0; | 10 int g(dynamic i) => 0; |
11 } | 11 } |
12 | 12 |
13 var /*@topType=A*/ a = new A(); | 13 var /*@topType=A*/ a = new A(); |
14 | 14 |
15 // There's a circularity between b and c because a.f is generic, so the type of | 15 // There's a circularity between b and c because a.f is generic, so the type of |
16 // c is required to infer b, and vice versa. | 16 // c is required to infer b, and vice versa. |
17 | 17 |
18 var /*@topType=() -> dynamic*/ b = /*@returnType=() -> dynamic*/ () => | 18 var /*@topType=dynamic*/ b = /*@returnType=dynamic*/ () => |
19 a. /*@typeArgs=() -> dynamic*/ /*@target=A::f*/ f(c); | 19 a. /*@typeArgs=dynamic*/ /*@target=A::f*/ f(c); |
20 var /*@topType=() -> dynamic*/ c = /*@returnType=() -> dynamic*/ () => | 20 var /*@topType=dynamic*/ c = /*@returnType=dynamic*/ () => |
21 a. /*@typeArgs=() -> dynamic*/ /*@target=A::f*/ f(b); | 21 a. /*@typeArgs=dynamic*/ /*@target=A::f*/ f(b); |
22 | 22 |
23 // e's use of a.g breaks the circularity, because a.g is not generic, therefore | 23 // e's use of a.g breaks the circularity, because a.g is not generic, therefore |
24 // the type of e does not depend on the type of d. | 24 // the type of e does not depend on the type of d. |
25 | 25 |
26 var /*@topType=() -> dynamic*/ d = /*@returnType=() -> int*/ () => | 26 var /*@topType=() -> () -> int*/ d = /*@returnType=() -> int*/ () => |
27 a. /*@typeArgs=() -> int*/ /*@target=A::f*/ f(e); | 27 a. /*@typeArgs=() -> int*/ /*@target=A::f*/ f(e); |
28 var /*@topType=() -> int*/ e = /*@returnType=int*/ () => | 28 var /*@topType=() -> int*/ e = /*@returnType=int*/ () => |
29 a. /*@target=A::g*/ g(d); | 29 a. /*@target=A::g*/ g(d); |
30 | 30 |
31 main() {} | 31 main() {} |
OLD | NEW |