blob: 68981f95cc802490430f52a3a2fe99c78c144149 [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.
// This test case checks that inference works for spread collections, and that
// the errors are reported when necessary.
/*@testedFeatures=inference*/
Map<K, V> bar<K, V>() => null;
foo(dynamic dynVar) {
List<int> spread = <int>[1, 2, 3];
Map<String, int> mapSpread = <String, int>{"foo": 4, "bar": 2};
int notSpreadInt = 42;
int Function() notSpreadFunction = null;
// Note that all values are actually ints.
Map<int, num> mapIntNum = <int, num>{42: 42};
List<num> listNum = <num>[42];
var /*@ type=List<dynamic>* */ lhs10 = /*@ typeArgs=dynamic */ [
...
/*@ typeArgs=dynamic */ []
];
var /*@ type=Set<dynamic>* */ set10 = <dynamic>{
... /*@ typeArgs=dynamic */ []
};
var /*@ type=Map<dynamic, dynamic>* */ map10 = <dynamic, dynamic>{
...
/*@ typeArgs=dynamic, dynamic */ {}
};
var /*@ type=Map<dynamic, dynamic>* */ map10ambiguous =
/*@ typeArgs=dynamic, dynamic */ {
... /*@ typeArgs=dynamic, dynamic */ {}
};
var /*@ type=List<int*>* */ lhs20 = /*@ typeArgs=int* */ [...spread];
var /*@ type=Set<int*>* */ set20 = /*@ typeArgs=int* */ {...spread, 42};
var /*@ type=Set<int*>* */ set20ambiguous = /*@ typeArgs=int* */ {...spread};
var /*@ type=Map<String*, int*>* */ map20 = /*@ typeArgs=String*, int* */
{...mapSpread, "baz": 42};
var /*@ type=Map<String*, int*>* */ map20ambiguous = /*@ typeArgs=String*, int* */
{...mapSpread};
var /*@ type=List<dynamic>* */ lhs21 = /*@ typeArgs=dynamic */ [
...(spread as dynamic)
];
var /*@ type=Set<dynamic>* */ set21 = /*@ typeArgs=dynamic */ {
...(spread as dynamic),
42
};
var /*@ type=Map<dynamic, dynamic>* */ map21 = /*@ typeArgs=dynamic, dynamic */
{...(mapSpread as dynamic), "baz": 42};
dynamic map21ambiguous = {...(mapSpread as dynamic)};
List<int> lhs22 = /*@ typeArgs=int* */ [... /*@ typeArgs=int* */ []];
Set<int> set22 = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ [], 42};
Set<int> set22ambiguous = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ []};
Map<String, int> map22 = /*@ typeArgs=String*, int* */
{... /*@ typeArgs=String*, int* */ {}};
List<List<int>> lhs23 = /*@ typeArgs=List<int*>* */ [
... /*@ typeArgs=List<int*>* */
[/*@ typeArgs=int* */ []]
];
Set<List<int>> set23 = /*@ typeArgs=List<int*>* */ {
... /*@ typeArgs=List<int*>* */
[/*@ typeArgs=int* */ []],
<int>[42]
};
Set<List<int>> set23ambiguous = /*@ typeArgs=List<int*>* */
{
... /*@ typeArgs=List<int*>* */ [/*@ typeArgs=int* */ []]
};
Map<String, List<int>> map23 = /*@ typeArgs=String*, List<int*>* */
{
... /*@ typeArgs=String*, List<int*>* */ {"baz": /*@ typeArgs=int* */ [] }
};
dynamic map24ambiguous = {...spread, ...mapSpread};
int lhs30 = /*@ typeArgs=int* */ [...spread];
int set30 = /*@ typeArgs=int* */ {...spread, 42};
int set30ambiguous = /*@ typeArgs=int* */
{...spread};
int map30 = /*@ typeArgs=String*, int* */
{...mapSpread, "baz": 42};
int map30ambiguous = /*@ typeArgs=String*, int* */
{...mapSpread};
List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
Set<dynamic> set40 = <dynamic>{...notSpreadInt};
Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
List<String> lhs60 = <String>[...spread];
Set<String> set60 = <String>{...spread};
Map<int, int> map60 = <int, int>{...mapSpread};
Map<String, String> map61 = <String, String>{...mapSpread};
List<int> lhs70 = <int>[...null];
Set<int> set70 = <int>{...null};
var /*@ type=Set<dynamic>* */ set71ambiguous = /*@ typeArgs=dynamic */
{
...null,
... /*@ typeArgs=dynamic */
[]
};
Map<String, int> map70 = <String, int>{...null};
List<int> lhs80 = <int>[...?null];
Set<int> set80 = <int>{...?null};
var /*@ type=Set<dynamic>* */ set81ambiguous = /*@ typeArgs=dynamic */
{...?null, ... /*@ typeArgs=dynamic */ []};
Map<String, int> map80 = <String, int>{...?null};
var /*@ type=Map<String*, int*>* */ map90 = <String, int>{
... /*@ typeArgs=String*, int* */ bar()
};
List<int> list100 = <int>[...listNum];
Map<num, int> map100 = <num, int>{...mapIntNum};
List<int> list110 = <int>[...dynVar];
Map<num, int> map110 = <num, int>{...dynVar};
}
main() {}