library test;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;
import "dart:math" as math;

import "dart:async";
import "dart:math";

static method test() → dynamic {
  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
    asy::FutureOr<core::num*>* :return_value;
    dynamic :async_stack_trace;
    (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:
        {
          if(math::Random::•().{math::Random::nextBool}()) {
            :return_value = asy::Future::value<core::int*>(1);
            break #L1;
          }
          else {
            :return_value = 2.0;
            break #L1;
          }
        }
        asy::_completeOnAsyncReturn(:async_completer, :return_value);
        return;
      }
      on dynamic catch(dynamic :exception, core::StackTrace* :stack_trace) {
        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
      }
    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
    return :async_completer.{asy::Completer::future};
  };
  asy::Future<core::num*>* g = f.call();
  asy::Future<core::int*>* h = f.call() as{TypeError} asy::Future<core::int*>*;
}
static method main() → dynamic {}
