library test /*isLegacy*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/async_await.dart:5:1: Error: Library doesn't support null safety.
// // @dart=2.9
// ^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
  synthetic constructor •() → self::MyFuture*
    : super core::Object::•()
    ;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
  abstract member-signature method then<R extends core::Object* = dynamic>((core::int*) →* FutureOr<self::MyFuture::then::R*>* onValue, {core::Function* onError = #C1}) → asy::Future<self::MyFuture::then::R*>*; -> asy::Future::then
  abstract member-signature method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<core::int*>*; -> asy::Future::catchError
  abstract member-signature method whenComplete(() →* FutureOr<void>* action) → asy::Future<core::int*>*; -> asy::Future::whenComplete
  abstract member-signature method asStream() → asy::Stream<core::int*>*; -> asy::Future::asStream
  abstract member-signature method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<core::int*>* onTimeout = #C1}) → asy::Future<core::int*>*; -> asy::Future::timeout
}
static method test() → void async /* emittedValueType= void */ {
  core::int* x0;
  asy::Future<core::int*>* x1;
  asy::Future<asy::Future<core::int*>*>* x2;
  asy::Future<FutureOr<core::int*>*>* x3;
  asy::Future<self::MyFuture*>* x4;
  FutureOr<core::int*>* x5;
  FutureOr<asy::Future<core::int*>*>* x6;
  FutureOr<FutureOr<core::int*>*>* x7;
  FutureOr<self::MyFuture*>* x8;
  self::MyFuture* x9;
  function test0() → asy::Future<core::int*>* async /* emittedValueType= core::int* */ 
    return x0;
  function test1() → asy::Future<core::int*>* async /* emittedValueType= core::int* */ 
    return x1;
  function test2() → asy::Future<asy::Future<core::int*>*>* async /* emittedValueType= asy::Future<core::int*>* */ 
    return x2;
  function test3() → asy::Future<FutureOr<core::int*>*>* async /* emittedValueType= FutureOr<core::int*>* */ 
    return x3;
  function test4() → asy::Future<self::MyFuture*>* async /* emittedValueType= self::MyFuture* */ 
    return x4;
  function test5() → asy::Future<core::int*>* async /* emittedValueType= core::int* */ 
    return x5;
  function test6() → asy::Future<asy::Future<core::int*>*>* async /* emittedValueType= asy::Future<core::int*>* */ 
    return x6;
  function test7() → asy::Future<FutureOr<core::int*>*>* async /* emittedValueType= FutureOr<core::int*>* */ 
    return x7;
  function test8() → asy::Future<self::MyFuture*>* async /* emittedValueType= self::MyFuture* */ 
    return x8;
  function test9() → asy::Future<core::int*>* async /* emittedValueType= core::int* */ 
    return x9;
  core::int* y0 = await x0 /* runtimeCheckType= asy::Future<core::int*>* */ ;
  core::int* y1 = await x1;
  asy::Future<core::int*>* y2 = await x2;
  FutureOr<core::int*>* y3 = await x3;
  self::MyFuture* y4 = await x4;
  core::int* y5 = await x5 /* runtimeCheckType= asy::Future<core::int*>* */ ;
  asy::Future<core::int*>* y6 = await x6 /* runtimeCheckType= asy::Future<asy::Future<core::int*>*>* */ ;
  FutureOr<core::int*>* y7 = await x7 /* runtimeCheckType= asy::Future<FutureOr<core::int*>*>* */ ;
  self::MyFuture* y8 = await x8 /* runtimeCheckType= asy::Future<self::MyFuture*>* */ ;
  core::int* y9 = await x9;
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
