library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:21:10: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
//   yield* getIterableNull(); // error
//          ^
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:24:27: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
// Iterable<bool> test5() => getIterableNull(); // error
//                           ^
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:38:12: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
//     yield* getIterableNull(); // error
//            ^
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:41:29: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
//   Iterable<bool> test5() => getIterableNull(); // error
//                             ^
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:49:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
//   })(); // error
//     ^
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:54:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
//   })(); // error
//     ^
//
// pkg/front_end/testcases/nnbd/issue41437b.dart:55:50: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
//  - 'Iterable' is from 'dart:core'.
//   Iterable<bool> var5 = (() => getIterableNull())(); // error
//                                                  ^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

static method getNull() → dynamic
  return null;
static method getIterableNull() → core::Iterable<dynamic> /* originally sync* */ {
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
    {
      {
        :iterator.{core::_SyncIterator::_current} = null;
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•<dynamic>(:sync_op);
}
static method getIterableBool() → core::Iterable<core::bool> /* originally sync* */ {
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
    {
      {
        :iterator.{core::_SyncIterator::_current} = true;
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•<core::bool>(:sync_op);
}
static method test1() → core::Iterable<core::bool> /* originally sync* */ {
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
    {
      {
        :iterator.{core::_SyncIterator::_current} = self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•<core::bool>(:sync_op);
}
static method test2() → core::Iterable<core::bool>
  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<core::bool>;
static method test3() → core::bool
  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
static method test4() → core::Iterable<core::bool> /* originally sync* */ {
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
    {
      {
        :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:21:10: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
  yield* getIterableNull(); // error
         ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•<core::bool>(:sync_op);
}
static method test5() → core::Iterable<core::bool>
  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:24:27: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
Iterable<bool> test5() => getIterableNull(); // error
                          ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
static method test6() → core::Iterable<core::bool>
  return self::getIterableBool();
static method test7() → core::Iterable<core::bool> /* originally sync* */ {
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
    {
      {
        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•<core::bool>(:sync_op);
}
static method test() → dynamic /* originally async */ {
  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
  asy::FutureOr<dynamic>? :return_value;
  dynamic :async_stack_trace;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        function test1() → core::Iterable<core::bool> /* originally sync* */ {
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
            {
              {
                :iterator.{core::_SyncIterator::_current} = self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
                [yield] true;
              }
            }
            return false;
          }
          return new core::_SyncIterable::•<core::bool>(:sync_op);
        }
        function test2() → core::Iterable<core::bool>
          return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<core::bool>;
        function test3() → core::bool
          return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
        function test4() → core::Iterable<core::bool> /* originally sync* */ {
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
            {
              {
                :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:38:12: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
    yield* getIterableNull(); // error
           ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
                [yield] true;
              }
            }
            return false;
          }
          return new core::_SyncIterable::•<core::bool>(:sync_op);
        }
        function test5() → core::Iterable<core::bool>
          return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:41:29: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
  Iterable<bool> test5() => getIterableNull(); // error
                            ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
        function test6() → core::Iterable<core::bool>
          return self::getIterableBool();
        function test7() → core::Iterable<core::bool> /* originally sync* */ {
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
            {
              {
                :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
                [yield] true;
              }
            }
            return false;
          }
          return new core::_SyncIterable::•<core::bool>(:sync_op);
        }
        core::Iterable<core::bool> var1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:49:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
  })(); // error
    ^" in (() → core::Iterable<dynamic> /* originally sync* */ {
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
            {
              {
                :iterator.{core::_SyncIterator::_current} = self::getNull();
                [yield] true;
              }
            }
            return false;
          }
          return new core::_SyncIterable::•<dynamic>(:sync_op);
        }).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
        core::Iterable<core::bool> var2 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<core::bool>;
        core::bool var3 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
        core::Iterable<core::bool> var4 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:54:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
  })(); // error
    ^" in (() → core::Iterable<dynamic> /* originally sync* */ {
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
            {
              {
                :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableNull();
                [yield] true;
              }
            }
            return false;
          }
          return new core::_SyncIterable::•<dynamic>(:sync_op);
        }).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
        core::Iterable<core::bool> var5 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:55:50: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
 - 'Iterable' is from 'dart:core'.
  Iterable<bool> var5 = (() => getIterableNull())(); // error
                                                 ^" in (() → core::Iterable<dynamic> => self::getIterableNull()).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
        core::Iterable<core::bool> var6 = (() → core::Iterable<core::bool> => self::getIterableBool()).call();
        core::Iterable<core::bool> var7 = (() → core::Iterable<core::bool> /* originally sync* */ {
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :sync_op(core::_SyncIterator<core::bool>? :iterator) → core::bool* yielding {
            {
              {
                :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
                [yield] true;
              }
            }
            return false;
          }
          return new core::_SyncIterable::•<core::bool>(:sync_op);
        }).call();
      }
      asy::_completeOnAsyncReturn(:async_completer, :return_value);
      return;
    }
    on dynamic catch(dynamic :exception, core::StackTrace :stack_trace) {
      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
    }
  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
  return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
