blob: 02cd6d236eb4b5ca1427d14f49d6db6418f82dfa [file] [log] [blame]
// Copyright (c) 2021, 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.
/// @assertion The dynamic semantics specified at this location is changed as
/// follows, where $f$ is the enclosing function with declared return type $T$,
/// and $e$ is the returned expression:
///
/// When $f$ is a synchronous non-generator, evaluation proceeds as follows:
/// The expression $e$ is evaluated to an object $o$.
/// A dynamic error occurs unless the dynamic type of $o$ is a subtype of
/// the actual return type of $f$
/// (\ref{actualTypes}).
/// Then the return statement $s$ completes returning $o$
/// (\ref{statementCompletion}).
///
/// \commentary{%
/// The case where the evaluation of $e$ throws is covered by the general rule
/// which propagates the throwing completion from $e$ to $s$ to the function body.%
/// }
///
/// When $f$ is an asynchronous non-generator with future value type $T_v$
/// (\ref{functions}), evaluation proceeds as follows:
/// The expression $e$ is evaluated to an object $o$.
/// If the run-time type of $o$ is a subtype of \code{Future<$T_v$>},
/// let \code{v} be a fresh variable bound to $o$ and
/// evaluate \code{\AWAIT{} v} to an object $r$;
/// otherwise let $r$ be $o$.
/// A dynamic error occurs unless the dynamic type of $r$
/// is a subtype of the actual value of $T_v$
/// (\ref{actualTypes}).
/// Then the return statement $s$ completes returning $r$
/// (\ref{statementCompletion}).
///
/// \commentary{%
/// The cases where $f$ is a generator cannot occur,
/// because in that case $s$ is a compile-time error.%
/// }
///
/// @description Check that a dynamic error occurs unless the dynamic type of $r$
/// is a subtype of the actual value of $T_v$. Test asynchronous non-generator
/// functions
/// @author sgrekhov@unipro.ru
// Requirements=nnbd-strong
import "../../Utils/expect.dart";
Future<int> f1() async {
dynamic x = 3.14;
return x;
}
main() {
asyncStart();
f1().catchError((_) {
asyncEnd();
return 42;
});
}