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

class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
  constructor •() → void
    : super core::Object::•() {}
  constructor value([dynamic x = null]) → void
    : super core::Object::•() {}
  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
    return null;
}
static field self::MyFuture<dynamic> f;
static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
        new /*@typeArgs=int*/ Future.value('hi'));
                                           ^" in let final core::String #t2 = "hi" in null));
static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
  asy::FutureOr<core::List<core::int>> :return_value;
  dynamic :async_stack_trace;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        :return_value = <core::int>[3];
        break #L1;
      }
      :completer.{asy::Completer::complete}(:return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :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);
  asy::Future::microtask<dynamic>(:async_op);
  return :completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
  asy::FutureOr<core::List<core::int>> :return_value;
  dynamic :async_stack_trace;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L2:
      {
        :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
        break #L2;
      }
      :completer.{asy::Completer::complete}(:return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :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);
  asy::Future::microtask<dynamic>(:async_op);
  return :completer.{asy::Completer::future};
}
static method main() → dynamic {}
