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

abstract class MyFuture extends core::Object implements asy::Future<core::int> {
  synthetic constructor •() → self::MyFuture
    : super core::Object::•()
    ;
}
static method test() → void async {
  core::int x0;
  asy::Future<core::int> x1;
  asy::Future<asy::Future<core::int>> x2;
  asy::Future<asy::FutureOr<core::int>> x3;
  asy::Future<self::MyFuture> x4;
  asy::FutureOr<core::int> x5;
  asy::FutureOr<asy::Future<core::int>> x6;
  asy::FutureOr<asy::FutureOr<core::int>> x7;
  asy::FutureOr<self::MyFuture> x8;
  self::MyFuture x9;
  function test0() → asy::Future<core::int> async 
    return x0;
  function test1() → asy::Future<core::int> async 
    return x1;
  function test2() → asy::Future<asy::Future<core::int>> async 
    return x2;
  function test3() → asy::Future<asy::FutureOr<core::int>> async 
    return x3;
  function test4() → asy::Future<self::MyFuture> async 
    return x4;
  function test5() → asy::Future<core::int> async 
    return x5;
  function test6() → asy::Future<asy::Future<core::int>> async 
    return x6;
  function test7() → asy::Future<asy::FutureOr<core::int>> async 
    return x7;
  function test8() → asy::Future<self::MyFuture> async 
    return x8;
  function test9() → asy::Future<core::int> async 
    return x9;
  core::int y0 = await x0;
  core::int y1 = await x1;
  asy::Future<core::int> y2 = await x2;
  asy::FutureOr<core::int> y3 = await x3;
  self::MyFuture y4 = await x4;
  core::int y5 = await x5;
  asy::Future<core::int> y6 = await x6;
  asy::FutureOr<core::int> y7 = await x7;
  self::MyFuture y8 = await x8;
  core::int y9 = await x9;
}
static method main() → dynamic {}
