library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
//  - 'Future' is from 'dart:async'.
// Future<bool> test5() => getFutureNull(); // error
//                         ^
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
//  - 'Future' is from 'dart:async'.
//   Future<bool> test5() => getFutureNull(); // error
//                           ^
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:31:52: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
//  - 'Future' is from 'dart:async'.
//   Future<bool> var1 = (() async => await getNull())(); // error
//                                                    ^
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:34:58: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
//  - 'Future' is from 'dart:async'.
//   Future<bool> var4 = (() async => await getFutureNull())(); // error
//                                                          ^
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:35:46: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
//  - 'Future' is from 'dart:async'.
//   Future<bool> var5 = (() => getFutureNull())(); // error
//                                              ^
//
import self as self;
import "dart:async" as asy;
import "dart:core" as core;

static method getNull() → dynamic
  return null;
static method getFutureNull() → asy::Future<dynamic> async /* futureValueType= dynamic */ {
  return null;
}
static method getFutureBool() → asy::Future<core::bool> async /* futureValueType= core::bool */ {
  return true;
}
static method test1() → asy::Future<core::bool> async /* futureValueType= core::bool */ 
  return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
static method test2() → asy::Future<core::bool>
  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
static method test3() → core::bool
  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
static method test4() → asy::Future<core::bool> async /* futureValueType= core::bool */ 
  return await self::getFutureNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
static method test5() → asy::Future<core::bool>
  return invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
 - 'Future' is from 'dart:async'.
Future<bool> test5() => getFutureNull(); // error
                        ^" in self::getFutureNull() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
static method test6() → asy::Future<core::bool>
  return self::getFutureBool();
static method test7() → asy::Future<core::bool> async /* futureValueType= core::bool */ 
  return self::getFutureBool();
static method test() → dynamic async /* futureValueType= dynamic */ {
  function test1() → asy::Future<core::bool> async /* futureValueType= core::bool */ 
    return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
  function test2() → asy::Future<core::bool>
    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
  function test3() → core::bool
    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
  function test4() → asy::Future<core::bool> async /* futureValueType= core::bool */ 
    return await self::getFutureNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
  function test5() → asy::Future<core::bool>
    return invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
 - 'Future' is from 'dart:async'.
  Future<bool> test5() => getFutureNull(); // error
                          ^" in self::getFutureNull() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  function test6() → asy::Future<core::bool>
    return self::getFutureBool();
  function test7() → asy::Future<core::bool> async /* futureValueType= core::bool */ 
    return self::getFutureBool();
  asy::Future<core::bool> var1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:31:52: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
 - 'Future' is from 'dart:async'.
  Future<bool> var1 = (() async => await getNull())(); // error
                                                   ^" in (() → asy::Future<dynamic> async /* futureValueType= dynamic */ => await self::getNull())(){() → asy::Future<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  asy::Future<core::bool> var2 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
  core::bool var3 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
  asy::Future<core::bool> var4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:34:58: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
 - 'Future' is from 'dart:async'.
  Future<bool> var4 = (() async => await getFutureNull())(); // error
                                                         ^" in (() → asy::Future<dynamic> async /* futureValueType= dynamic */ => await self::getFutureNull())(){() → asy::Future<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  asy::Future<core::bool> var5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:35:46: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
 - 'Future' is from 'dart:async'.
  Future<bool> var5 = (() => getFutureNull())(); // error
                                             ^" in (() → asy::Future<dynamic> => self::getFutureNull())(){() → asy::Future<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  asy::Future<core::bool> var6 = (() → asy::Future<core::bool> => self::getFutureBool())(){() → asy::Future<core::bool>};
  asy::Future<core::bool> var7 = (() → asy::Future<core::bool> async /* futureValueType= core::bool */ => self::getFutureBool())(){() → asy::Future<core::bool>};
}
static method main() → dynamic {}
