| // 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. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| void f(num callback(num x)) {} |
| |
| Object intToObject(int x) => null; |
| Object numToObject(num x) => null; |
| Object objectToObject(Object x) => null; |
| int intToInt(int x) => null; |
| int numToInt(num x) => null; |
| int objectToInt(Object x) => null; |
| num intToNum(int x) => null; |
| num numToNum(num x) => null; |
| num objectToNum(Object x) => null; |
| |
| main() { |
| // Unrelated types (not assignable) |
| f(intToInt); |
| //^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE |
| // [cfe] The argument type 'int Function(int)' can't be assigned to the parameter type 'num Function(num)'. |
| f(objectToObject); |
| //^^^^^^^^^^^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE |
| // [cfe] The argument type 'Object Function(Object)' can't be assigned to the parameter type 'num Function(num)'. |
| |
| // Assignable but fails at runtime. |
| var intToObject2 = intToObject; |
| Expect.throwsTypeError(() => f(intToObject2)); |
| var intToNum2 = intToNum; |
| Expect.throwsTypeError(() => f(intToNum2)); |
| var numToObject2 = numToObject; |
| Expect.throwsTypeError(() => f(numToObject2)); |
| |
| // Ok |
| f(numToNum); |
| f(numToInt); |
| f(objectToNum); |
| f(objectToInt); |
| } |