Index: tests/language_2/covariant_tear_off_type_test.dart |
diff --git a/tests/language_2/covariant_tear_off_type_test.dart b/tests/language_2/covariant_tear_off_type_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c3a848c1f0fc13094b4c4773c74e372c2dc80cc1 |
--- /dev/null |
+++ b/tests/language_2/covariant_tear_off_type_test.dart |
@@ -0,0 +1,27 @@ |
+// 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. |
+ |
+import "package:expect/expect.dart"; |
+ |
+typedef U F<T, U>(T x); |
+ |
+class C<T> { |
+ T f(List<T> x) {} |
+} |
+ |
+F<List<num>, num> g(C<num> c) { |
+ return c.f; |
+} |
+ |
+void main() { |
+ var tearoff = g(new C<int>()); |
+ // Since C.f's x parameter is covariant, its type is changed to Object when |
+ // determining the type of the tearoff. So the type of the tearoff should be |
+ // `(Object) -> int`. (Not, for example, `(List<Object>) -> int` or |
+ // `(List<Object>) -> Object`) |
+ Expect.isTrue(tearoff is F<Object, int>); |
+ // Because the function accepts any object, we can pass strings to it. This |
+ // will not work in Dart 1. |
+ Expect.isTrue(tearoff is F<String, int>); |
+} |