/*
 * Copyright (c) 2018, 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.
 */
/**
 * @assertion It is a static error when the collection is a map and the key type
 * of any of the body elements may not be assigned to the map's key type.
 *
 * @description Checks that it is a static error when the collection is a map
 * and the key type of any of the body elements may not be assigned to the map's
 * key type.
 * @author sgrekhov@unipro.ru
 */

main() {
  <int, int>{if (true) "not int": 1};
  //                   ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.MAP_KEY_TYPE_NOT_ASSIGNABLE
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
  Map<int, int> m1 = {if (true) "not int": 1};
  //                            ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.MAP_KEY_TYPE_NOT_ASSIGNABLE
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
  const <int, int>{if (true) "not int": 1};
  //                         ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.MAP_KEY_TYPE_NOT_ASSIGNABLE
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
  <int, int>{for (var i in []) "not int": 1};
  //                           ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.MAP_KEY_TYPE_NOT_ASSIGNABLE
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
  Map<int, int> m2 = {for (var i in []) "not int": 1};
  //                                    ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.MAP_KEY_TYPE_NOT_ASSIGNABLE
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
}
