// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart=2.9
/*@testedFeatures=inference*/
library test;

import 'dart:async';

abstract class MyFuture implements Future<int> {}

void test() async {
  int x0;
  Future<int> x1;
  Future<Future<int>> x2;
  Future<FutureOr<int>> x3;
  Future<MyFuture> x4;
  FutureOr<int> x5;
  FutureOr<Future<int>> x6;
  FutureOr<FutureOr<int>> x7;
  FutureOr<MyFuture> x8;
  MyFuture x9;

  /*@ returnType=Future<int*>* */ test0() async => x0;
  /*@ returnType=Future<int*>* */ test1() async => x1;
  /*@ returnType=Future<Future<int*>*>* */ test2() async => x2;
  /*@ returnType=Future<FutureOr<int*>*>* */ test3() async => x3;
  /*@ returnType=Future<MyFuture*>* */ test4() async => x4;
  /*@ returnType=Future<int*>* */ test5() async => x5;
  /*@ returnType=Future<Future<int*>*>* */ test6() async => x6;
  /*@ returnType=Future<FutureOr<int*>*>* */ test7() async => x7;
  /*@ returnType=Future<MyFuture*>* */ test8() async => x8;
  /*@ returnType=Future<int*>* */ test9() async => x9;

  var /*@ type=int* */ y0 = await x0;
  var /*@ type=int* */ y1 = await x1;
  var /*@ type=Future<int*>* */ y2 = await x2;
  var /*@ type=FutureOr<int*>* */ y3 = await x3;
  var /*@ type=MyFuture* */ y4 = await x4;
  var /*@ type=int* */ y5 = await x5;
  var /*@ type=Future<int*>* */ y6 = await x6;
  var /*@ type=FutureOr<int*>* */ y7 = await x7;
  var /*@ type=MyFuture* */ y8 = await x8;
  var /*@ type=int* */ y9 = await x9;
}

main() {}
