library test;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/async_await.dart:25:48: Error: A value of type 'Future<Future<int>>' can't be returned from an async function with return type 'Future<int>'.
//  - 'Future' is from 'dart:async'.
//   /*@returnType=Future<int>*/ test2() async => x2;
//                                                ^
//
// pkg/front_end/testcases/inference/async_await.dart:26:48: Error: A value of type 'Future<FutureOr<int>>' can't be returned from an async function with return type 'Future<int>'.
//  - 'Future' is from 'dart:async'.
//   /*@returnType=Future<int>*/ test3() async => x3;
//                                                ^
//
// pkg/front_end/testcases/inference/async_await.dart:27:48: Error: A value of type 'Future<MyFuture>' can't be returned from an async function with return type 'Future<int>'.
//  - 'Future' is from 'dart:async'.
//  - 'MyFuture' is from 'pkg/front_end/testcases/inference/async_await.dart'.
//   /*@returnType=Future<int>*/ test4() async => x4;
//                                                ^
//
// pkg/front_end/testcases/inference/async_await.dart:29:48: Error: A value of type 'FutureOr<Future<int>>' can't be returned from an async function with return type 'Future<int>'.
//  - 'Future' is from 'dart:async'.
//   /*@returnType=Future<int>*/ test6() async => x6;
//                                                ^
//
// pkg/front_end/testcases/inference/async_await.dart:30:48: Error: A value of type 'FutureOr<FutureOr<int>>' can't be returned from an async function with return type 'Future<int>'.
//  - 'Future' is from 'dart:async'.
//   /*@returnType=Future<int>*/ test7() async => x7;
//                                                ^
//
// pkg/front_end/testcases/inference/async_await.dart:31:48: Error: A value of type 'FutureOr<MyFuture>' can't be returned from an async function with return type 'Future<int>'.
//  - 'MyFuture' is from 'pkg/front_end/testcases/inference/async_await.dart'.
//  - 'Future' is from 'dart:async'.
//   /*@returnType=Future<int>*/ test8() async => x8;
//                                                ^
//
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::•()
    ;
}
static method test(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) → void async /* emittedValueType= void */ {
  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<core::int> async /* emittedValueType= core::int */ 
    return invalid-expression "pkg/front_end/testcases/inference/async_await.dart:25:48: Error: A value of type 'Future<Future<int>>' can't be returned from an async function with return type 'Future<int>'.
 - 'Future' is from 'dart:async'.
  /*@returnType=Future<int>*/ test2() async => x2;
                                               ^" in x2 as{TypeError} core::int;
  function test3() → asy::Future<core::int> async /* emittedValueType= core::int */ 
    return invalid-expression "pkg/front_end/testcases/inference/async_await.dart:26:48: Error: A value of type 'Future<FutureOr<int>>' can't be returned from an async function with return type 'Future<int>'.
 - 'Future' is from 'dart:async'.
  /*@returnType=Future<int>*/ test3() async => x3;
                                               ^" in x3 as{TypeError} core::int;
  function test4() → asy::Future<core::int> async /* emittedValueType= core::int */ 
    return invalid-expression "pkg/front_end/testcases/inference/async_await.dart:27:48: Error: A value of type 'Future<MyFuture>' can't be returned from an async function with return type 'Future<int>'.
 - 'Future' is from 'dart:async'.
 - 'MyFuture' is from 'pkg/front_end/testcases/inference/async_await.dart'.
  /*@returnType=Future<int>*/ test4() async => x4;
                                               ^" in x4 as{TypeError} core::int;
  function test5() → asy::Future<core::int> async /* emittedValueType= core::int */ 
    return x5;
  function test6() → asy::Future<core::int> async /* emittedValueType= core::int */ 
    return invalid-expression "pkg/front_end/testcases/inference/async_await.dart:29:48: Error: A value of type 'FutureOr<Future<int>>' can't be returned from an async function with return type 'Future<int>'.
 - 'Future' is from 'dart:async'.
  /*@returnType=Future<int>*/ test6() async => x6;
                                               ^" in x6 as{TypeError} core::int;
  function test7() → asy::Future<core::int> async /* emittedValueType= core::int */ 
    return invalid-expression "pkg/front_end/testcases/inference/async_await.dart:30:48: Error: A value of type 'FutureOr<FutureOr<int>>' can't be returned from an async function with return type 'Future<int>'.
 - 'Future' is from 'dart:async'.
  /*@returnType=Future<int>*/ test7() async => x7;
                                               ^" in x7 as{TypeError} core::int;
  function test8() → asy::Future<core::int> async /* emittedValueType= core::int */ 
    return invalid-expression "pkg/front_end/testcases/inference/async_await.dart:31:48: Error: A value of type 'FutureOr<MyFuture>' can't be returned from an async function with return type 'Future<int>'.
 - 'MyFuture' is from 'pkg/front_end/testcases/inference/async_await.dart'.
 - 'Future' is from 'dart:async'.
  /*@returnType=Future<int>*/ test8() async => x8;
                                               ^" in x8 as{TypeError} core::int;
  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 {}
