| // 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$ |
| * @author sgrekhov@unipro.ru |
| */ |
| // Requirements=nnbd-weak |
| import "../../../Utils/expect.dart"; |
| |
| int f1() { |
| dynamic x = 3.14; |
| return x; |
| } |
| |
| main() { |
| Expect.throws(() { |
| f1(); |
| }); |
| } |