library;
//
// Problems in library:
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error4 = {if (b) 0: 1 else for (var a in list) a};
//                                ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:36:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error5 = {if (b) for (var a in list) a else 0: 1};
//                      ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
//                                ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:44:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
//                      ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:37:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error6 = {
//              ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:40:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error7 = {
//              ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:45:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error10 = {
//               ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:48:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error11 = {
//               ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:51:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error12 = {
//               ^
//
import self as self;
import "dart:core" as core;

static field core::bool* b = false;
static field core::List<dynamic>* list = core::_GrowableList::•<dynamic>(0);
static field core::Map<dynamic, dynamic>* map0 = <dynamic, dynamic>{};
static field core::Map<dynamic, dynamic>* map1 = block {
  final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
  if(self::b)
    #t1.{core::Map::[]=}{Invariant}(0, 1);
  else {
    core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{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::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
    }
  }
} =>#t1;
static field core::Map<dynamic, dynamic>* map2 = block {
  final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
  if(self::b) {
    core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final core::MapEntry<dynamic, dynamic>* #t4 = :sync-for-iterator.{core::Iterator::current};
      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}, #t4.{core::MapEntry::value});
    }
  }
  else
    #t3.{core::Map::[]=}{Invariant}(0, 1);
} =>#t3;
static field core::Map<dynamic, dynamic>* map3 = block {
  final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
  if(self::b) {
    core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current};
      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
    }
  }
  else {
    core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final core::MapEntry<dynamic, dynamic>* #t7 = :sync-for-iterator.{core::Iterator::current};
      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
    }
  }
} =>#t5;
static field core::Map<dynamic, core::int*>* map4 = block {
  final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
  if(self::b)
    #t8.{core::Map::[]=}{Invariant}(0, 1);
  else {
    core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      dynamic a = :sync-for-iterator.{core::Iterator::current};
      #t8.{core::Map::[]=}{Invariant}(a, 1);
    }
  }
} =>#t8;
static field core::Map<dynamic, core::int*>* map5 = block {
  final core::Map<dynamic, core::int*>* #t9 = <dynamic, core::int*>{};
  if(self::b) {
    core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      dynamic a = :sync-for-iterator.{core::Iterator::current};
      #t9.{core::Map::[]=}{Invariant}(a, 1);
    }
  }
  else
    #t9.{core::Map::[]=}{Invariant}(0, 1);
} =>#t9;
static field core::Map<dynamic, core::int*>* map6 = block {
  final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
  if(self::b)
    #t10.{core::Map::[]=}{Invariant}(0, 1);
  else {
    core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      dynamic a = :sync-for-iterator.{core::Iterator::current};
      {
        core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{a: 1}.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<dynamic, core::int*>* #t11 = :sync-for-iterator.{core::Iterator::current};
          #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
        }
      }
    }
  }
} =>#t10;
static field core::Map<dynamic, core::int*>* map7 = block {
  final core::Map<dynamic, core::int*>* #t12 = <dynamic, core::int*>{};
  if(self::b) {
    core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      dynamic a = :sync-for-iterator.{core::Iterator::current};
      {
        core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{a: 1}.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<dynamic, core::int*>* #t13 = :sync-for-iterator.{core::Iterator::current};
          #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
        }
      }
    }
  }
  else
    #t12.{core::Map::[]=}{Invariant}(0, 1);
} =>#t12;
static field core::Map<dynamic, core::int*>* map8 = block {
  final core::Map<dynamic, core::int*>* #t14 = <dynamic, core::int*>{};
  if(self::b)
    #t14.{core::Map::[]=}{Invariant}(0, 1);
  else
    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i), 1);
} =>#t14;
static field core::Map<dynamic, core::int*>* map9 = block {
  final core::Map<dynamic, core::int*>* #t15 = <dynamic, core::int*>{};
  if(self::b)
    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i), 1);
  else
    #t15.{core::Map::[]=}{Invariant}(0, 1);
} =>#t15;
static field core::Map<dynamic, core::int*>* map10 = block {
  final core::Map<dynamic, core::int*>* #t16 = <dynamic, core::int*>{};
  if(self::b)
    #t16.{core::Map::[]=}{Invariant}(0, 1);
  else
    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current};
        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
      }
    }
} =>#t16;
static field core::Map<dynamic, core::int*>* map11 = block {
  final core::Map<dynamic, core::int*>* #t18 = <dynamic, core::int*>{};
  if(self::b)
    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current};
        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
      }
    }
  else
    #t18.{core::Map::[]=}{Invariant}(0, 1);
} =>#t18;
static field core::Map<core::int*, core::int*>* map12 = block {
  final core::Map<core::int*, core::int*>* #t20 = <core::int*, core::int*>{};
  if(self::b)
    #t20.{core::Map::[]=}{Invariant}(0, 1);
  else
    if(self::b) {
      core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{0: 1}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::int*, core::int*>* #t21 = :sync-for-iterator.{core::Iterator::current};
        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
      }
    }
} =>#t20;
static field core::Map<dynamic, Null>* error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error4 = {if (b) 0: 1 else for (var a in list) a};
                               ^": null};
static field core::Map<dynamic, Null>* error5 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:36:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error5 = {if (b) for (var a in list) a else 0: 1};
                     ^": null};
static field Null error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:37:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error6 = {
             ^";
static field Null error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:40:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error7 = {
             ^";
static field core::Map<dynamic, Null>* error8 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
                               ^": null};
static field core::Map<dynamic, Null>* error9 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:44:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
                     ^": null};
static field Null error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:45:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error10 = {
              ^";
static field Null error11 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:48:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error11 = {
              ^";
static field Null error12 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:51:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error12 = {
              ^";
static method main() → dynamic {}
