library test;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'Future<dynamic Function(dynamic)>' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
//  - 'Future' is from 'dart:async'.
//     return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
//                                      ^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

typedef IntToInt = (core::int*) →* core::int*;
static method main() → dynamic {
  function a() → (core::int*) →* core::int* {
    return (core::int* x) → core::int* => x;
  }
  function b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
    final asy::_Future<(core::int*) →* core::int*>* :async_future = new asy::_Future::•<(core::int*) →* core::int*>();
    core::bool* :is_sync = false;
    FutureOr<(core::int*) →* core::int*>* :return_value;
    (dynamic) →* dynamic :async_op_then;
    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try {
        #L1:
        {
          :return_value = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'Future<dynamic Function(dynamic)>' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
 - 'Future' is from 'dart:async'.
    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
                                     ^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
          break #L1;
        }
        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
      }
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :async_op(){() →* dynamic};
    :is_sync = true;
    return :async_future;
  }
  function c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
      core::int* :await_jump_var = 0;
      dynamic :await_ctx_var;
      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
        {
          {
            :iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
            [yield] true;
          }
        }
        return false;
      }
      return :sync_op;
    }
    return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
  }
  function d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
      core::int* :await_jump_var = 0;
      dynamic :await_ctx_var;
      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
        {
          {
            :iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::_literal1<(core::int*) →* core::int*>((core::int* x) → core::int* => x);
            [yield] true;
          }
        }
        return false;
      }
      return :sync_op;
    }
    return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
  }
  function e() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
    asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
    dynamic :controller_stream;
    (dynamic) →* dynamic :async_op_then;
    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    dynamic :saved_try_context_var0;
    dynamic :saved_try_context_var1;
    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try
        try {
          #L2:
          {
            if(:controller.{asy::_AsyncStarStreamController::add}((core::int* x) → core::int* => x){((core::int*) →* core::int*) → core::bool})
              return null;
            else
              [yield] null;
          }
          return;
        }
        on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
          :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace){(core::Object, core::StackTrace) → void};
        }
      finally {
        :controller.{asy::_AsyncStarStreamController::close}(){() → dynamic};
      }
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream}{asy::Stream<(core::int*) →* core::int*>};
    return :controller_stream;
  }
  function f() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
    asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
    dynamic :controller_stream;
    (dynamic) →* dynamic :async_op_then;
    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
    core::int* :await_jump_var = 0;
    dynamic :await_ctx_var;
    dynamic :saved_try_context_var0;
    dynamic :saved_try_context_var1;
    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
      try
        try {
          #L3:
          {
            if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<(core::int*) →* core::int*>(core::_GrowableList::_literal1<(core::int*) →* core::int*>((core::int* x) → core::int* => x))){(asy::Stream<(core::int*) →* core::int*>) → core::bool})
              return null;
            else
              [yield] null;
          }
          return;
        }
        on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
          :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace){(core::Object, core::StackTrace) → void};
        }
      finally {
        :controller.{asy::_AsyncStarStreamController::close}(){() → dynamic};
      }
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream}{asy::Stream<(core::int*) →* core::int*>};
    return :controller_stream;
  }
}
