library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: 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> test5() => getFutureNull(); // error
//                         ^
//
// pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: 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> 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 {
  return null;
}
static method getFutureBool() → asy::Future<core::bool> async {
  return true;
}
static method test1() → asy::Future<core::bool> async 
  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 
  return await self::getFutureNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
static method test5() → asy::Future<core::bool>
  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: 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> 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 
  return self::getFutureBool();
static method test() → dynamic async {
  function test1() → asy::Future<core::bool> async 
    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 
    return await self::getFutureNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
  function test5() → asy::Future<core::bool>
    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: 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> 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 
    return self::getFutureBool();
  asy::Future<core::bool> var1 = let final<BottomType> #t3 = 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 => await self::getNull()).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  asy::Future<core::bool> var2 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
  core::bool var3 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
  asy::Future<core::bool> var4 = let final<BottomType> #t4 = 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 => await self::getFutureNull()).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  asy::Future<core::bool> var5 = let final<BottomType> #t5 = 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()).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
  asy::Future<core::bool> var6 = (() → asy::Future<core::bool> => self::getFutureBool()).call();
  asy::Future<core::bool> var7 = (() → asy::Future<core::bool> async => self::getFutureBool()).call();
}
static method main() → dynamic {}
