blob: 4f6fc11f47eaa488a53c86daa937bdbc7cc82b36 [file] [log] [blame]
// Copyright (c) 2017, 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.
/*@testedFeatures=inference*/
library test;
typedef T Function2<S, T>(S x);
void test() {
{
Function2<int, String> l0 = /*@ returnType=Null */ (int x) => null;
Function2<int, String> l1 = /*@ returnType=String* */ (int x) => "hello";
Function2<int, String>
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
"hello";
Function2<int, String>
l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
Function2<int, String> l4 = /*@ returnType=String* */ (int x) {
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
};
}
{
Function2<int, String> l0 = /*@ returnType=Null */ (/*@ type=int* */ x) => null;
Function2<int, String> l1 = /*@ returnType=String* */ (/*@ type=int* */ x) =>
"hello";
Function2<int, String>
l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (/*@ type=int* */ x) =>
3;
Function2<int, String> l3 = /*@ returnType=String* */ (/*@ type=int* */ x) {
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
};
Function2<int, String> l4 = /*@ returnType=String* */ (/*@ type=int* */ x) {
return /*error:RETURN_OF_INVALID_TYPE*/ x;
};
}
{
Function2<int, List<String>> l0 = /*@ returnType=Null */ (int x) => null;
Function2<int, List<String>> l1 = /*@ returnType=List<String*>* */ (int
x) => /*@ typeArgs=String* */ ["hello"];
Function2<int, List<String>>
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
x) => /*@ typeArgs=String* */ ["hello"];
Function2<int, List<String>>
l3 = /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
];
Function2<int, List<String>> l4 = /*@ returnType=List<String*>* */ (int x) {
return /*@ typeArgs=String* */ [
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
];
};
}
{
Function2<int, int> l0 = /*@ returnType=int* */ (/*@ type=int* */ x) => x;
Function2<int, int> l1 = /*@ returnType=int* */ (/*@ type=int* */ x) =>
x /*@target=num.+*/ + 1;
Function2<int, String>
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (/*@ type=int* */ x) =>
x;
Function2<int, String>
l3 = /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/ x
.substring(3);
Function2<String, String>
l4 = /*@ returnType=String* */ (/*@ type=String* */ x) =>
x. /*@target=String.substring*/ substring(3);
}
}
main() {}