/*
 * Copyright (c) 2019, 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 Since the spread is unpacked and its individual elements added to
 * the containing collection, we don't require the spread expression itself to
 * be assignable to the collection's type. For example, this is allowed:
 *
 *    var numbers = <num>[1, 2, 3];
 *    var ints = <int>[...numbers];
 *
 * This works because the individual elements in numbers do happen to have the
 * right type even though the list that contains them does not. As long as the
 * spread object is "spreadable" — it implements [Iterable] — there is no
 * static error.
 * @note That's an error with null-safety to assign Set<num> to Set<int>, see
 * https://github.com/dart-lang/language/blob/471a98ca0dd5b02d194ffad0dc128065771253a0/specification/dartLangSpec.tex#L8245,
 * because `num` isn't assignable to `int`.
 * @description Checks that static error is thrown if spread element and
 * set type arguments are incompatible.
 * @author iarkh@unipro.ru
 */

main() {
  List<num> numbers = <num>[1, 2, 3];
  <String>{...numbers};
//            ^
// [analyzer] unspecified
// [cfe] unspecified

  <int>{...numbers};
//         ^
// [analyzer] unspecified
// [cfe] unspecified

  var objects = <Object>[2, 7, 9];
  <int>{...objects};
//         ^
// [analyzer] unspecified
// [cfe] unspecified

  <String>{...objects};
//            ^
// [analyzer] unspecified
// [cfe] unspecified

  var numbers1 = [1.1, 2, 3];
  <int>{...numbers1};
//         ^
// [analyzer] unspecified
// [cfe] unspecified

  List<num>? numbers2 = [1, 2, 3];
  <int>{...?numbers2};
//          ^
// [analyzer] unspecified
// [cfe] unspecified

  List<Object>? objects1 = <Object>[2, 7, 9];
  <int>{...?objects1};
//          ^
// [analyzer] unspecified
// [cfe] unspecified

  <String>{...?objects1};
//             ^
// [analyzer] unspecified
// [cfe] unspecified
}
