blob: 93f4f7c521e6510b4e963ada6d0f6fce75c50fc4 [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() {}