library test;
//
// 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 /* futureValueType= 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 /* futureValueType= core::int* */ 
    return x0;
  function test1() → asy::Future<core::int*>* async /* futureValueType= core::int* */ 
    return x1;
  function test2() → asy::Future<asy::Future<core::int*>*>* async /* futureValueType= asy::Future<core::int*>* */ 
    return x2;
  function test3() → asy::Future<FutureOr<core::int*>*>* async /* futureValueType= FutureOr<core::int*>* */ 
    return x3;
  function test4() → asy::Future<self::MyFuture*>* async /* futureValueType= self::MyFuture* */ 
    return x4;
  function test5() → asy::Future<core::int*>* async /* futureValueType= core::int* */ 
    return x5;
  function test6() → asy::Future<asy::Future<core::int*>*>* async /* futureValueType= asy::Future<core::int*>* */ 
    return x6;
  function test7() → asy::Future<FutureOr<core::int*>*>* async /* futureValueType= FutureOr<core::int*>* */ 
    return x7;
  function test8() → asy::Future<self::MyFuture*>* async /* futureValueType= self::MyFuture* */ 
    return x8;
  function test9() → asy::Future<core::int*>* async /* futureValueType= 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
}
