Index: tests/language/type_promotion_functions_test.dart |
diff --git a/tests/language/type_promotion_functions_test.dart b/tests/language/type_promotion_functions_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e6cc0c46a249a6cf0be1d1d45aab7ecfc51076c7 |
--- /dev/null |
+++ b/tests/language/type_promotion_functions_test.dart |
@@ -0,0 +1,113 @@ |
+// Copyright (c) 2013, 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. |
+ |
+// Test type promotion of functions. |
+ |
+class A {} |
+class B extends A {} |
+class C {} |
+ |
+// We have the following more specific (<<) relations between these typedefs: |
+// |
+// FuncDynToDyn << FuncAtoDyn |
+// FuncDynToDyn << FuncDynToA << FuncDynToVoid |
+ |
+typedef FuncAtoDyn(A a); |
+typedef FuncDynToDyn(x); |
+typedef void FuncDynToVoid(x); |
+typedef A FuncDynToA(x); |
+ |
+func(x) => x; |
+ |
+A a; |
+B b; |
+C c; |
+ |
+main() { |
+ testFuncAtoDyn(); |
+ testFuncDynToDyn(); |
+ testFuncDynToVoid(); |
+ testFuncDynToA(); |
+} |
+ |
+testFuncAtoDyn() { |
+ FuncAtoDyn funcAtoDyn = func; |
+ a = funcAtoDyn(new A()); |
+ b = funcAtoDyn(new B()); |
+ c = funcAtoDyn(new C()); /// 01: static type warning |
+ |
+ if (funcAtoDyn is FuncDynToDyn) { // Promotion: FuncDynToDyn << FuncAtoDyn. |
+ a = funcAtoDyn(new A()); |
+ b = funcAtoDyn(new B()); |
+ c = funcAtoDyn(new C()); |
+ } |
+} |
+ |
+testFuncDynToDyn() { |
+ FuncDynToDyn funcDynToDyn = func; |
+ a = funcDynToDyn(new A()); |
+ b = funcDynToDyn(new B()); |
+ c = funcDynToDyn(new C()); |
+ |
+ if (funcDynToDyn is FuncAtoDyn) { |
+ // No promotion: FuncAtoDyn !<< FuncDynToDyn. |
+ a = funcDynToDyn(new A()); |
+ b = funcDynToDyn(new B()); |
+ c = funcDynToDyn(new C()); |
+ } |
+ |
+ if (funcDynToDyn is FuncDynToVoid) { |
+ // No promotion: FuncDynToVoid !<< FuncDynToDyn. |
+ a = funcDynToDyn(new A()); |
+ b = funcDynToDyn(new B()); |
+ c = funcDynToDyn(new C()); |
+ } |
+ |
+ if (funcDynToDyn is FuncDynToA) { |
+ // No promotion: FuncDynToA !<< FuncDynToDyn. |
+ a = funcDynToDyn(new A()); |
+ b = funcDynToDyn(new B()); |
+ c = funcDynToDyn(new C()); |
+ } |
+} |
+ |
+testFuncDynToVoid() { |
+ FuncDynToVoid funcDynToVoid = func; |
+ a = funcDynToVoid(new A()); /// 02: static type warning |
+ b = funcDynToVoid(new B()); /// 03: static type warning |
+ c = funcDynToVoid(new C()); /// 04: static type warning |
+ |
+ if (funcDynToVoid is FuncDynToDyn) { |
+ // Promotion: FuncDynToDyn << FuncDynToVoid. |
+ a = funcDynToVoid(new A()); |
+ b = funcDynToVoid(new B()); |
+ c = funcDynToVoid(new C()); |
+ } |
+ |
+ if (funcDynToVoid is FuncDynToA) { // Promotion: FuncDynToA << FuncDynToVoid. |
+ a = funcDynToVoid(new A()); |
+ b = funcDynToVoid(new B()); |
+ c = funcDynToVoid(new C()); /// 05: static type warning |
+ } |
+} |
+ |
+testFuncDynToA() { |
+ FuncDynToA funcDynToA = func; |
+ a = funcDynToA(new A()); |
+ b = funcDynToA(new B()); |
+ c = funcDynToA(new C()); /// 06: static type warning |
+ |
+ if (funcDynToA is FuncDynToDyn) { // Promotion: FuncDynToDyn << FuncDynToA. |
+ a = funcDynToA(new A()); |
+ b = funcDynToA(new B()); |
+ c = funcDynToA(new C()); |
+ } |
+ |
+ if (funcDynToA is FuncDynToVoid) { |
+ // No promotion: FuncDynToVoid !<< FuncDynToA. |
+ a = funcDynToA(new A()); |
+ b = funcDynToA(new B()); |
+ c = funcDynToA(new C()); /// 07: static type warning |
+ } |
+} |