// 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 It is a static error if:
///    If a list or set spread element's static type implements [Iterable<T>] for
///    some [T] and [T] is not assignable to the element type of the list.
/// @description Checks that compile error is thrown if spread element type in
/// set literal is not assignable to the type of the set.
/// @author iarkh@unipro.ru


import "dart:collection";

class MyIterable<T> extends IterableBase<T> {
  late MyIterator<T> iterator;
  MyIterable() { iterator = MyIterator(); }
  Iterator getIterator<T>() { return iterator; }
}

class MyIterator<T> extends Iterator<T> {
  @override
  bool moveNext() { return false; }

  @override
  T get current => throw "Should not reach here!";
}

main() {

  List<Object> l1  = <Object> [];
  List<int> l2  = <int>[1, 2, 3];
  List<bool> l3  = <bool>[true, false, true, true];
  List<bool> l4  = <bool>[true, false, true, true];
  List<int> l5  = <int>[];
  List<bool> l6  = <bool>[];
  List<String> l7  = <String>[];
  List<String> l8  = <String>["1", "2"];
  List<Object> l9 = <Object>["1", "2"];

  Iterable<int> i1 = new MyIterable<int>();
  Iterable<String> i2 = new MyIterable<String>();
  Iterable<bool> i3 = new MyIterable<bool>();
  Iterable i4 = new MyIterable<Object>();

  Set list1 = <String>{...l1};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'Object' to collection elements of type 'String'.
  Set list2 = <String>{...l2};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'int' to collection elements of type 'String'.
  Set list3 = <Object>{...l3};
  Set list4 = <String>{...l4};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'bool' to collection elements of type 'String'.
  Set list5 = <String>{...l5};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'int' to collection elements of type 'String'.
  Set list6 = <String>{...l6};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'bool' to collection elements of type 'String'.
  Set list7 = <String>{...l7};
  Set list8 = <String>{...l8};
  Set list9 = <String>{...l9};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'Object' to collection elements of type 'String'.

  Set list11 = <String>{...i1};
  //                       ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'int' to collection elements of type 'String'.
  Set list12 = <String>{...i2};
  Set list13 = <String>{...i3};
  //                       ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'bool' to collection elements of type 'String'.
  Set list14 = <String>{...i4};
}
