| Index: tests/language/closure_type_test.dart
|
| ===================================================================
|
| --- tests/language/closure_type_test.dart (revision 0)
|
| +++ tests/language/closure_type_test.dart (revision 0)
|
| @@ -0,0 +1,38 @@
|
| +// Copyright (c) 2012, 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 test for a closure result type test that cannot be eliminated at compile
|
| +// time.
|
| +
|
| +isCheckedMode() {
|
| + try {
|
| + var i = 1;
|
| + String s = i;
|
| + return false;
|
| + } catch(var e) {
|
| + return true;
|
| + }
|
| +}
|
| +
|
| +
|
| +void test(int func(int value), int value) {
|
| + bool got_type_error = false;
|
| + try {
|
| + // Because of function subtyping rules, the static return type of a closure
|
| + // call cannot be relied upon for static type analysis. For example, a
|
| + // function returning Dynamic (function 'root') can be assigned to a closure
|
| + // variable declared to return int (closure 'func') and may actually return
|
| + // a double at run-time.
|
| + // Therefore, eliminating the run-time type check would be wrong.
|
| + int x = func(value);
|
| + Expect.equals(value, x * x);
|
| + } catch (TypeError error) {
|
| + got_type_error = true;
|
| + }
|
| + // Type error expected in checked mode only.
|
| + Expect.isTrue(got_type_error == isCheckedMode());
|
| +}
|
| +
|
| +root(x) => Math.sqrt(x);
|
| +
|
| +main() => test(root, 4);
|
|
|