| // Copyright (c) 2020, 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. |
| |
| // Test that downcasting elements in collection-for is a compile error. |
| void main() { |
| testList(); |
| testMap(); |
| testSet(); |
| testNullIterable(); |
| } |
| |
| void testList() { |
| // Downcast iterable. |
| Object obj = <int>[1, 2, 3, 4]; |
| var a = <int>[for (var n in obj) n]; |
| // ^^^ |
| // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE |
| // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'. |
| |
| // Downcast variable. |
| var b = <int>[ |
| for (int n in <num>[1, 2, 3, 4]) n |
| // ^ |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| // ^^^^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE |
| ]; |
| |
| // Downcast element. |
| var c = <int>[ |
| for (num n in <num>[1, 2, 3, 4]) n |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| ]; |
| |
| // Downcast condition. |
| var d = <int>[for (var i = 1; (i < 2) as Object; i++) i]; |
| // ^^^^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION |
| // ^ |
| // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'. |
| } |
| |
| void testMap() { |
| // Downcast iterable. |
| Object obj = <int>[1, 2, 3, 4]; |
| var a = <int, int>{for (var n in obj) n: n}; |
| // ^^^ |
| // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE |
| // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'. |
| |
| // Downcast variable. |
| var b = <int, int>{ |
| for (int n in <num>[1, 2, 3, 4]) n: n |
| // ^ |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| // ^^^^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE |
| }; |
| |
| // Downcast element. |
| var c = <int, int>{ |
| for (num n in <num>[1, 2, 3, 4]) n: n |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.MAP_KEY_TYPE_NOT_ASSIGNABLE |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.MAP_VALUE_TYPE_NOT_ASSIGNABLE |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| }; |
| |
| // Downcast condition. |
| var d = <int, int>{for (var i = 1; (i < 2) as Object; i++) i: i}; |
| // ^^^^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION |
| // ^ |
| // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'. |
| } |
| |
| void testSet() { |
| // Downcast iterable. |
| Object obj = <int>[1, 2, 3, 4]; |
| var a = <int>{for (var n in obj) n}; |
| // ^^^ |
| // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE |
| // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'. |
| |
| // Downcast variable. |
| var b = <int>{ |
| for (int n in <num>[1, 2, 3, 4]) n |
| // ^ |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| // ^^^^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE |
| }; |
| |
| // Downcast element. |
| var c = <int>{ |
| for (num n in <num>[1, 2, 3, 4]) n |
| // ^ |
| // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE |
| // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'. |
| }; |
| |
| // Downcast condition. |
| var d = <int>{for (var i = 1; (i < 2) as Object; i++) i}; |
| // ^^^^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION |
| // ^ |
| // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'. |
| } |
| |
| void testNullIterable() { |
| // Null iterable. |
| Iterable<int>? nullIterable = null; |
| var a = <int>[for (var i in nullIterable) 1]; |
| // ^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE |
| // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't. |
| var b = {for (var i in nullIterable) 1: 1}; |
| // ^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE |
| // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't. |
| var c = <int>{for (var i in nullIterable) 1}; |
| // ^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE |
| // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't. |
| } |