// Copyright (c) 2015, 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.

import 'dart:async';

class Derived<T> implements Future<T> {
  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

class FixedPoint<T> implements Future<FixedPoint<T>> {
  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

// TODO(vsm): Restore when https://github.com/dart-lang/sdk/issues/25611
// is fixed.
/*
class Divergent<T> implements Future<Divergent<Divergent<T>>> {
  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
*/


test() async {
  // flatten(Derived<int>) = int
  int x = await new Derived<int>(); /// 01: runtime error
  Future<int> f() async => new Derived<int>(); /// 02: ok
  Future<int> f() async { return new Derived<int>(); } /// 03: ok
  Future<int> x = (() async => new Derived<int>())(); /// 04: runtime error

  // TODO(vsm): Restore when https://github.com/dart-lang/sdk/issues/25611
  // is fixed.
  /*
  // flatten(FixedPoint<int>) = FixedPoint<int>
  FixedPoint<int> x = await new FixedPoint<int>(); /// 05: runtime error
  Future<FixedPoint<int>> f() async => new FixedPoint<int>(); /// 06: ok
  Future<FixedPoint<int>> f() async { return new FixedPoint<int>(); } /// 07: ok
  Future<FixedPoint<int>> x = (() async => new FixedPoint<int>())(); /// 08: runtime error

  // flatten(Divergent<int>) = Divergent<Divergent<int>>
  Divergent<Divergent<int>> x = await new Divergent<int>(); /// 09: runtime error
  Future<Divergent<Divergent<int>>> f() async => new Divergent<int>(); /// 10: ok
  Future<Divergent<Divergent<int>>> f() async { return new Divergent<int>(); } /// 11: ok
  Future<Divergent<Divergent<int>>> x = (() async => new Divergent<int>())(); /// 12: runtime error
  */
}

main() {
  test();
}