// 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 Let T be the explicit or inferred type argument to the type
/// literal. It's a compile-time error if the static type of any element
/// expression is not assignable to T.
///
/// @description Checks that it's a compile-time error if the static type of any
/// element expression is not assignable to T
/// @author sgrekhov@unipro.ru

class A {
  const A();
}
class B extends A {
  const B();
}
class C extends B {
  const C();
}

main() {
  var v1 = const <int>{1, '2', 3};
//                        ^^^
// [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
  var v2 = <int>{1, '2', 3};
//                  ^^^
// [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
  var v3 = <B>{new B(), new C(), new A()};
//                               ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
//                                   ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
  var v4 = const <B>{const B(), const C(), const A()};
//                                         ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
//                                               ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
