|  | // 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)); | 
|  | } |