blob: b46a2a3b1c1c21bdc2c5b2fe22d6911b36e2b372 [file] [log] [blame]
// 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 If a list or set literal has a downwards inference type of
/// [Iterable<T>] for some [T], then the downwards inference context type of a
/// spread element in that list is [Iterable<T>].
/// @description Checks statically that a spread element inference context type
/// is [T] in the list literal
/// @author iarkh@unipro.ru
class A {}
class B extends A {}
class C extends B {}
List<T> getAList<T>(var a) { return <T>[a]; }
main() {
var a_list = getAList<A>(new A());
var b_list = getAList<B>(new B());
var c_list = getAList<C>(new C());
var int_list = getAList<int>(12);
var str_list = ["string"];
A a = new A();
B b = new B();
C c = new C();
List list1 = <int>[...str_list];
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
// [cfe] Can't assign spread elements of type 'String' to collection elements of type 'int'.
List list2 = <int>[1, 2, ...a_list, 14];
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
// [cfe] Can't assign spread elements of type 'A' to collection elements of type 'int'.
List list3 = <int>[1, 14, 0, ...c_list];
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
// [cfe] Can't assign spread elements of type 'C' to collection elements of type 'int'.
List list4 = <A>[...int_list];
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
// [cfe] Can't assign spread elements of type 'int' to collection elements of type 'A'.
List list5 = <A>[...?str_list];
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}