| // Copyright (c) 2016, 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 'dart:math' as math; |
| import 'dart:math' show min; // <-- generic: <T extends num>(T, T) -> T |
| import 'package:expect/expect.dart'; |
| |
| class C { |
| T m<T extends num>(T x, T y) => min(x, y); |
| int m2(int x, int y) => min(x, y); |
| } |
| |
| typedef int Int2Int2Int(int x, int y); |
| |
| void _test(Int2Int2Int f) { |
| int y = f(123, 456); |
| Expect.equals(y, 123); |
| // `f` doesn't take type args. |
| Expect.throws(() => (f as dynamic)<int>(123, 456)); |
| } |
| |
| void _testParam(T minFn<T extends num>(T x, T y)) { |
| _test(minFn); |
| } |
| |
| main() { |
| // Strong mode infers: `min<int>` |
| // Test simple/prefixed identifiers and property access |
| _test(min); |
| _test(math.min); |
| _test(new C().m); |
| |
| // Test local function, variable, and parameter |
| T m<T extends num>(T x, T y) => min(x, y); |
| _test(m); |
| final f = min; |
| _test(f); |
| _testParam(math.min); |
| |
| // A few misc tests for methods |
| Expect.equals(123, (new C() as dynamic).m<int>(123, 456)); |
| Expect.throws(() => (new C() as dynamic).m2<int>(123, 456)); |
| } |