OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library analyzer.test.src.task.strong.checker_test; | 5 library analyzer.test.src.task.strong.checker_test; |
6 | 6 |
7 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 7 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
8 | 8 |
9 import 'strong_test_helper.dart'; | 9 import 'strong_test_helper.dart'; |
10 | 10 |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 checkFile(''' | 395 checkFile(''' |
396 abstract class Equality<Q> {} | 396 abstract class Equality<Q> {} |
397 abstract class EqualityBase<R> implements Equality<R> { | 397 abstract class EqualityBase<R> implements Equality<R> { |
398 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); | 398 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); |
399 const EqualityBase(); | 399 const EqualityBase(); |
400 } | 400 } |
401 class DefaultEquality<S> extends EqualityBase<S> { | 401 class DefaultEquality<S> extends EqualityBase<S> { |
402 const DefaultEquality(); | 402 const DefaultEquality(); |
403 } | 403 } |
404 class SetEquality<T> implements Equality<T> { | 404 class SetEquality<T> implements Equality<T> { |
405 final Equality<T> field = const DefaultEquality(); | 405 final Equality<T> field = /*info:INFERRED_TYPE_ALLOCATION*/const DefaultEquali
ty(); |
406 const SetEquality([Equality<T> inner = const DefaultEquality()]); | 406 const SetEquality([Equality<T> inner = /*info:INFERRED_TYPE_ALLOCATION*/const
DefaultEquality()]); |
407 } | 407 } |
408 class C<Q> { | 408 class C<Q> { |
409 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; | 409 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; |
410 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; | 410 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; |
411 const C(); | 411 const C(); |
412 } | 412 } |
413 main() { | 413 main() { |
414 const SetEquality<String>(); | 414 const SetEquality<String>(); |
415 } | 415 } |
416 '''); | 416 '''); |
(...skipping 1965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2382 addFile(r''' | 2382 addFile(r''' |
2383 class C<T> {} | 2383 class C<T> {} |
2384 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} | 2384 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} |
2385 class M2<T> {} | 2385 class M2<T> {} |
2386 class I<T> {} | 2386 class I<T> {} |
2387 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C | 2387 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C |
2388 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 | 2388 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 |
2389 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} | 2389 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} |
2390 | 2390 |
2391 C f(D d) { | 2391 C f(D d) { |
2392 D x = new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); | 2392 D x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); |
2393 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2393 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
2394 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2394 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
2395 return new /*error:IMPLICIT_DYNAMIC_TYPE*/C(); | 2395 return /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/C()
; |
2396 } | 2396 } |
2397 | 2397 |
2398 class A<T extends num> {} | 2398 class A<T extends num> {} |
2399 class N1<T extends List<int>> {} | 2399 class N1<T extends List<int>> {} |
2400 class N2<T extends Object> {} | 2400 class N2<T extends Object> {} |
2401 class J<T extends Object> {} | 2401 class J<T extends Object> {} |
2402 class B<T extends Object> extends A with N1, N2 implements J {} | 2402 class B<T extends Object> extends A with N1, N2 implements J {} |
2403 A g(B b) { | 2403 A g(B b) { |
2404 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); | 2404 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); |
2405 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); | 2405 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); |
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3346 M<Object> mOfOs; | 3346 M<Object> mOfOs; |
3347 M<A> mOfAs; | 3347 M<A> mOfAs; |
3348 | 3348 |
3349 { | 3349 { |
3350 lOfDs = mOfDs; | 3350 lOfDs = mOfDs; |
3351 lOfDs = mOfOs; | 3351 lOfDs = mOfOs; |
3352 lOfDs = mOfAs; | 3352 lOfDs = mOfAs; |
3353 lOfDs = lOfDs; | 3353 lOfDs = lOfDs; |
3354 lOfDs = lOfOs; | 3354 lOfDs = lOfOs; |
3355 lOfDs = lOfAs; | 3355 lOfDs = lOfAs; |
3356 lOfDs = new L(); // Reset type propagation. | 3356 lOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new L(); // Reset type propagation. |
3357 } | 3357 } |
3358 { | 3358 { |
3359 lOfOs = mOfDs; | 3359 lOfOs = mOfDs; |
3360 lOfOs = mOfOs; | 3360 lOfOs = mOfOs; |
3361 lOfOs = mOfAs; | 3361 lOfOs = mOfAs; |
3362 lOfOs = lOfDs; | 3362 lOfOs = lOfDs; |
3363 lOfOs = lOfOs; | 3363 lOfOs = lOfOs; |
3364 lOfOs = lOfAs; | 3364 lOfOs = lOfAs; |
3365 lOfOs = new L<Object>(); // Reset type propagation. | 3365 lOfOs = new L<Object>(); // Reset type propagation. |
3366 } | 3366 } |
3367 { | 3367 { |
3368 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; | 3368 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; |
3369 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; | 3369 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; |
3370 lOfAs = mOfAs; | 3370 lOfAs = mOfAs; |
3371 lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs; | 3371 lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs; |
3372 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3372 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3373 lOfAs = lOfAs; | 3373 lOfAs = lOfAs; |
3374 lOfAs = new L<A>(); // Reset type propagation. | 3374 lOfAs = new L<A>(); // Reset type propagation. |
3375 } | 3375 } |
3376 { | 3376 { |
3377 mOfDs = mOfDs; | 3377 mOfDs = mOfDs; |
3378 mOfDs = mOfOs; | 3378 mOfDs = mOfOs; |
3379 mOfDs = mOfAs; | 3379 mOfDs = mOfAs; |
3380 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; | 3380 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; |
3381 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3381 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3382 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; | 3382 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; |
3383 mOfDs = new M(); // Reset type propagation. | 3383 mOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new M(); // Reset type propagation. |
3384 } | 3384 } |
3385 { | 3385 { |
3386 mOfOs = mOfDs; | 3386 mOfOs = mOfDs; |
3387 mOfOs = mOfOs; | 3387 mOfOs = mOfOs; |
3388 mOfOs = mOfAs; | 3388 mOfOs = mOfAs; |
3389 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; | 3389 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; |
3390 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3390 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3391 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; | 3391 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; |
3392 mOfOs = new M<Object>(); // Reset type propagation. | 3392 mOfOs = new M<Object>(); // Reset type propagation. |
3393 } | 3393 } |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3673 num n = 3; | 3673 num n = 3; |
3674 int i = 3; | 3674 int i = 3; |
3675 String s = "hello"; | 3675 String s = "hello"; |
3676 { | 3676 { |
3677 List<int> l = <int>[i]; | 3677 List<int> l = <int>[i]; |
3678 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; | 3678 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; |
3679 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; | 3679 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; |
3680 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS
SIGNABLE*/s]; | 3680 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS
SIGNABLE*/s]; |
3681 } | 3681 } |
3682 { | 3682 { |
3683 List l = /*info:INFERRED_TYPE_LITERAL*/[i]; | 3683 List l = [i]; |
3684 l = /*info:INFERRED_TYPE_LITERAL*/[s]; | 3684 l = [s]; |
3685 l = /*info:INFERRED_TYPE_LITERAL*/[n]; | 3685 l = [n]; |
3686 l = /*info:INFERRED_TYPE_LITERAL*/[i, n, s]; | 3686 l = [i, n, s]; |
3687 } | 3687 } |
3688 { | 3688 { |
3689 Map<String, int> m = <String, int>{s: i}; | 3689 Map<String, int> m = <String, int>{s: i}; |
3690 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; | 3690 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; |
3691 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; | 3691 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; |
3692 m = <String, int>{s: i, | 3692 m = <String, int>{s: i, |
3693 s: /*info:DOWN_CAST_IMPLICIT*/n, | 3693 s: /*info:DOWN_CAST_IMPLICIT*/n, |
3694 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; | 3694 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; |
3695 } | 3695 } |
3696 // TODO(leafp): We can't currently test for key errors since the | 3696 // TODO(leafp): We can't currently test for key errors since the |
3697 // error marker binds to the entire entry. | 3697 // error marker binds to the entire entry. |
3698 { | 3698 { |
3699 Map m = /*info:INFERRED_TYPE_LITERAL*/{s: i}; | 3699 Map m = {s: i}; |
3700 m = /*info:INFERRED_TYPE_LITERAL*/{s: s}; | 3700 m = {s: s}; |
3701 m = /*info:INFERRED_TYPE_LITERAL*/{s: n}; | 3701 m = {s: n}; |
3702 m = /*info:INFERRED_TYPE_LITERAL*/ | 3702 m = {s: i, |
3703 {s: i, | |
3704 s: n, | 3703 s: n, |
3705 s: s}; | 3704 s: s}; |
3706 m = /*info:INFERRED_TYPE_LITERAL*/ | 3705 m = {i: s, |
3707 {i: s, | |
3708 n: s, | 3706 n: s, |
3709 s: s}; | 3707 s: s}; |
3710 } | 3708 } |
3711 } | 3709 } |
3712 '''); | 3710 '''); |
3713 } | 3711 } |
3714 | 3712 |
3715 void test_typePromotionFromDynamic() { | 3713 void test_typePromotionFromDynamic() { |
3716 checkFile(r''' | 3714 checkFile(r''' |
3717 f() { | 3715 f() { |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4027 // Regression test for https://github.com/dart-lang/sdk/issues/25069 | 4025 // Regression test for https://github.com/dart-lang/sdk/issues/25069 |
4028 checkFile(''' | 4026 checkFile(''' |
4029 typedef int Foo(); | 4027 typedef int Foo(); |
4030 void foo() {} | 4028 void foo() {} |
4031 void main () { | 4029 void main () { |
4032 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); | 4030 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); |
4033 } | 4031 } |
4034 '''); | 4032 '''); |
4035 } | 4033 } |
4036 } | 4034 } |
OLD | NEW |