library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:33: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:34: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:41: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:42: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:35:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error6 = {
//              ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:38:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error7 = {
//              ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error10 = {
//               ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:46:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
// var error11 = {
//               ^
//
// pkg/front_end/testcases/unified_collections/mixed_entries.dart:49: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 = <dynamic>[];
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){(dynamic, dynamic) → void};
  else
    for (final has-declared-initializer core::MapEntry<dynamic, dynamic> #t2 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
} =>#t1;
static field core::Map<dynamic, dynamic> map2 = block {
  final core::Map<dynamic, dynamic> #t3 = <dynamic, dynamic>{};
  if(self::b)
    for (final has-declared-initializer core::MapEntry<dynamic, dynamic> #t4 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
  else
    #t3.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) → void};
} =>#t3;
static field core::Map<dynamic, dynamic> map3 = block {
  final core::Map<dynamic, dynamic> #t5 = <dynamic, dynamic>{};
  if(self::b)
    for (final has-declared-initializer core::MapEntry<dynamic, dynamic> #t6 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
  else
    for (final has-declared-initializer core::MapEntry<dynamic, dynamic> #t7 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
} =>#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){(dynamic, core::int) → void};
  else
    for (dynamic a in self::list)
      #t8.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int) → void};
} =>#t8;
static field core::Map<dynamic, core::int> map5 = block {
  final core::Map<dynamic, core::int> #t9 = <dynamic, core::int>{};
  if(self::b)
    for (dynamic a in self::list)
      #t9.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int) → void};
  else
    #t9.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int) → void};
} =>#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){(dynamic, core::int) → void};
  else
    for (dynamic a in self::list)
      for (final has-declared-initializer core::MapEntry<dynamic, core::int> #t11 in <dynamic, core::int>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int>>})
        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}{dynamic}, #t11.{core::MapEntry::value}{core::int}){(dynamic, core::int) → void};
} =>#t10;
static field core::Map<dynamic, core::int> map7 = block {
  final core::Map<dynamic, core::int> #t12 = <dynamic, core::int>{};
  if(self::b)
    for (dynamic a in self::list)
      for (final has-declared-initializer core::MapEntry<dynamic, core::int> #t13 in <dynamic, core::int>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int>>})
        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{dynamic}, #t13.{core::MapEntry::value}{core::int}){(dynamic, core::int) → void};
  else
    #t12.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int) → void};
} =>#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){(dynamic, core::int) → void};
  else
    for (core::int i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int) → dynamic}, 1){(dynamic, core::int) → void};
} =>#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}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int) → dynamic}, 1){(dynamic, core::int) → void};
  else
    #t15.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int) → void};
} =>#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){(dynamic, core::int) → void};
  else
    for (core::int i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      for (final has-declared-initializer core::MapEntry<dynamic, core::int> #t17 in <dynamic, core::int>{self::list.{core::List::[]}(i){(core::int) → dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int>>})
        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{dynamic}, #t17.{core::MapEntry::value}{core::int}){(dynamic, core::int) → void};
} =>#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}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      for (final has-declared-initializer core::MapEntry<dynamic, core::int> #t19 in <dynamic, core::int>{self::list.{core::List::[]}(i){(core::int) → dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int>>})
        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{core::int}){(dynamic, core::int) → void};
  else
    #t18.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int) → void};
} =>#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){(core::int, core::int) → void};
  else
    if(self::b)
      for (final has-declared-initializer core::MapEntry<core::int, core::int> #t21 in <core::int, core::int>{0: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::int}, #t21.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
} =>#t20;
static field core::Map<dynamic, Null> error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33: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:34: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 Never error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error6 = {
             ^";
static field Never error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:38: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:41: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:42: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 Never error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error10 = {
              ^";
static field Never error11 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:46:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error11 = {
              ^";
static field Never error12 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:49:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
var error12 = {
              ^";
static method main() → dynamic {}
