library test /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
//                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
//                                                                                                                        ^
//
// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
//                                                                                                            ^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

static method make(core::int x) → asy::Future<core::int>
  return asy::Future::•<core::int>(() → core::int => x);
static method test() → dynamic {
  core::Iterable<asy::Future<core::int>> list = <core::int>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int>>(#C1){((core::int) → asy::Future<core::int>) → core::Iterable<asy::Future<core::int>>};
  asy::Future<core::List<core::int>> results = asy::Future::wait<core::int>(list);
  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → FutureOr<core::String> => list.{core::Iterable::fold}<FutureOr<core::String>>("", (FutureOr<core::String>x, core::int y) → FutureOr<core::String> => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
Try correcting the operator to an existing operator, or defining a '+' operator.
                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                       ^" in x{<unresolved>}.+(y.{core::int::toString}(){() → core::String}) as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::String>){(FutureOr<core::String>, (FutureOr<core::String>, core::int) → FutureOr<core::String>) → FutureOr<core::String>}){((core::List<core::int>) → FutureOr<core::String>, {onError: core::Function?}) → asy::Future<core::String>};
  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → FutureOr<core::String> => list.{core::Iterable::fold}<FutureOr<core::String>>("", invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                           ^" in ((core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}(){() → core::String}){(core::String) → core::String}) as{TypeError,ForNonNullableByDefault} (FutureOr<core::String>, core::int) → FutureOr<core::String>){(FutureOr<core::String>, (FutureOr<core::String>, core::int) → FutureOr<core::String>) → FutureOr<core::String>}){((core::List<core::int>) → FutureOr<core::String>, {onError: core::Function?}) → asy::Future<core::String>};
  asy::Future<core::String> results4 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → core::String => list.{core::Iterable::fold}<core::String>("", (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}(){() → core::String}){(core::String) → core::String}){(core::String, (core::String, core::int) → core::String) → core::String}){((core::List<core::int>) → FutureOr<core::String>, {onError: core::Function?}) → asy::Future<core::String>};
}
static method main() → dynamic {}

constants  {
  #C1 = static-tearoff self::make
}
