// Copyright (c) 2017, 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';

typedef int IntToInt(int i);

main() {
  IntToInt a() {
    return /*@ returnType=int* */ (/*@ type=int* */ x) => x;
  }

  Future<IntToInt> b() async {
    // TODO(paulberry): this is broken due to bug 29689.
    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
  }

  Iterable<IntToInt> c() sync* {
    yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
  }

  Iterable<IntToInt> d() sync* {
    yield* /*@ typeArgs=(int*) ->* int* */ [
      /*@ returnType=int* */ (/*@ type=int* */ x) => x
    ];
  }

  Stream<IntToInt> e() async* {
    yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
  }

  Stream<IntToInt> f() async* {
    yield* new /*@ typeArgs=(int*) ->* int* */ Stream.fromIterable(
        /*@ typeArgs=(int*) ->* int* */ [
          /*@ returnType=int* */ (/*@ type=int* */ x) => x
        ]);
  }
}
