library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//   if (i > 0) ...nullableMap, // error
//                 ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//   if (i > 0) ...nullableList, // error
//                 ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//   if (i > 0) ...nullableList, // error
//                 ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
//     if (i > 0) ...x, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//     if (i > 0) ...y, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//     if (i > 0) ...x, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
//     if (i > 0) ...x, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//     if (i > 0) ...y, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//     if (i > 0) ...x, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
//     if (i > 0) ...x, // error
//                   ^
//
// pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
//     if (i > 0) ...y, // error
//                   ^
//
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

static field core::int i = 1;
static field core::Map<core::int, core::String>? nullableMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
static field core::List<core::int>? nullableList = core::_GrowableList::_literal3<core::int>(1, 2, 3);
static field dynamic dynamicMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
static field dynamic dynamicList = core::_GrowableList::_literal3<core::int>(1, 2, 3);
static field core::Map<dynamic, dynamic> map1 = block {
  final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
  if (i > 0) ...nullableMap, // error
                ^", null){(dynamic, dynamic) → void};
  if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
    core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current};
      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
    }
  }
  if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
    core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current};
      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
    }
  }
} =>#t1;
static field core::Set<dynamic> set1 = block {
  final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
  #t4.{core::Set::add}(0){(dynamic) → core::bool};
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
  if (i > 0) ...nullableList, // error
                ^"){(dynamic) → core::bool};
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t4.{core::Set::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t4.{core::Set::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
} =>#t4;
static field core::List<dynamic> list1 = block {
  final core::List<dynamic> #t5 = core::_GrowableList::•<dynamic>(0);
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t5.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
  if (i > 0) ...nullableList, // error
                ^"){(dynamic) → void};
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t5.{core::List::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
  if(self::i.{core::num::>}(0){(core::num) → core::bool})
    #t5.{core::List::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
} =>#t5;
static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
  core::Map<dynamic, dynamic> map2 = block {
    final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
    if (i > 0) ...x, // error
                  ^", null){(dynamic, dynamic) → void};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
    if (i > 0) ...y, // error
                  ^", null){(dynamic, dynamic) → void};
    if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
      core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = z.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, dynamic> #t7 = :sync-for-iterator.{core::Iterator::current};
        #t6.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
      }
    }
    if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
      core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = y!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, dynamic> #t8 = :sync-for-iterator.{core::Iterator::current};
        #t6.{core::Map::[]=}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
      }
    }
  } =>#t6;
}
static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
  core::Set<dynamic> set2 = block {
    final core::Set<dynamic> #t9 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t9.{core::Set::add}(0){(dynamic) → core::bool};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
    if (i > 0) ...x, // error
                  ^"){(dynamic) → core::bool};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
    if (i > 0) ...y, // error
                  ^"){(dynamic) → core::bool};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t9.{core::Set::addAll}(z){(core::Iterable<dynamic>) → void};
  } =>#t9;
  core::List<dynamic> list2 = block {
    final core::List<dynamic> #t10 = core::_GrowableList::•<dynamic>(0);
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
    if (i > 0) ...x, // error
                  ^"){(dynamic) → void};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
    if (i > 0) ...y, // error
                  ^"){(dynamic) → void};
    if(self::i.{core::num::>}(0){(core::num) → core::bool})
      #t10.{core::List::addAll}(z){(core::Iterable<dynamic>) → void};
  } =>#t10;
}
static method main() → dynamic {}
