library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
//   var l2 = [...?n1];
//                 ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
//   var l3 = [...n2];
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
//   var l5 = [...n3];
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
//   var s2 = {...?n1, n1};
//                 ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
//   var s3 = {...n2, n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
//   var s5 = {...n3, n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
//   var m2 = {...?n1, n1: n1};
//                 ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
//   var m3 = {...n2, n1: n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
//   var m5 = {...n3, n1: n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
//   var l2 = [...?n1];
//                 ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
//   var l3 = [...n2];
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
//   var l5 = [...n3];
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
//   var s2 = {...?n1, n1};
//                 ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
//   var s3 = {...n2, n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
//   var s5 = {...n3, n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
//   var m2 = {...?n1, n1: n1};
//                 ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
//   var m3 = {...n2, n1: n1};
//                ^
//
// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
//   var m5 = {...n3, n1: n1};
//                ^
//
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

static method test1(Never n1, Never? n2, Null n3) → dynamic {
  core::List<Never> l1 = block {
    final core::List<Never> #t1 = <Never>[];
    for (final Never #t2 in n1)
      #t1.{core::List::add}(#t2);
  } =>#t1;
  core::List<Never> l2 = block {
    final core::List<Never> #t3 = <Never>[];
    final core::Iterable<Never>? #t4 = n1;
    if(!#t4.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t4{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t5 = :sync-for-iterator.{core::Iterator::current};
        #t3.{core::List::add}(#t5);
      }
    }
  } =>#t3;
  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
  var l3 = [...n2];
               ^"];
  core::List<Never> l4 = block {
    final core::List<Never> #t6 = <Never>[];
    final core::Iterable<Never>? #t7 = n2;
    if(!#t7.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t7{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t8 = :sync-for-iterator.{core::Iterator::current};
        #t6.{core::List::add}(#t8);
      }
    }
  } =>#t6;
  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
  var l5 = [...n3];
               ^"];
  core::List<Never> l6 = block {
    final core::List<Never> #t9 = <Never>[];
    final core::Iterable<Never>? #t10 = n3;
    if(!#t10.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t10{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t11 = :sync-for-iterator.{core::Iterator::current};
        #t9.{core::List::add}(#t11);
      }
    }
  } =>#t9;
  core::Set<Never> s1 = block {
    final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
    for (final Never #t13 in n1)
      #t12.{core::Set::add}(#t13);
    #t12.{core::Set::add}(n1);
  } =>#t12;
  core::Set<Never> s2 = block {
    final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
    final core::Iterable<Never>? #t15 = n1;
    if(!#t15.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t16 = :sync-for-iterator.{core::Iterator::current};
        #t14.{core::Set::add}(#t16);
      }
    }
    #t14.{core::Set::add}(n1);
  } =>#t14;
  core::Set<dynamic> s3 = block {
    final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
  var s3 = {...n2, n1};
               ^");
    #t17.{core::Set::add}(n1);
  } =>#t17;
  core::Set<Never> s4 = block {
    final core::Set<Never> #t18 = new col::_CompactLinkedHashSet::•<Never>();
    final core::Iterable<Never>? #t19 = n2;
    if(!#t19.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t19{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t20 = :sync-for-iterator.{core::Iterator::current};
        #t18.{core::Set::add}(#t20);
      }
    }
    #t18.{core::Set::add}(n1);
  } =>#t18;
  core::Set<dynamic> s5 = block {
    final core::Set<dynamic> #t21 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t21.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
  var s5 = {...n3, n1};
               ^");
    #t21.{core::Set::add}(n1);
  } =>#t21;
  core::Set<Never> s6 = block {
    final core::Set<Never> #t22 = new col::_CompactLinkedHashSet::•<Never>();
    final core::Iterable<Never>? #t23 = n3;
    if(!#t23.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t23{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t24 = :sync-for-iterator.{core::Iterator::current};
        #t22.{core::Set::add}(#t24);
      }
    }
    #t22.{core::Set::add}(n1);
  } =>#t22;
  core::Map<Never, Never> m1 = block {
    final core::Map<Never, Never> #t25 = <Never, Never>{};
    {
      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t26 = :sync-for-iterator.{core::Iterator::current};
        #t25.{core::Map::[]=}(#t26.{core::MapEntry::key}, #t26.{core::MapEntry::value});
      }
    }
    #t25.{core::Map::[]=}(n1, n1);
  } =>#t25;
  core::Map<Never, Never> m2 = block {
    final core::Map<Never, Never> #t27 = <Never, Never>{};
    final core::Map<Never, Never>? #t28 = n1;
    if(!#t28.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t28{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t29 = :sync-for-iterator.{core::Iterator::current};
        #t27.{core::Map::[]=}(#t29.{core::MapEntry::key}, #t29.{core::MapEntry::value});
      }
    }
    #t27.{core::Map::[]=}(n1, n1);
  } =>#t27;
  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
  var m3 = {...n2, n1: n1};
               ^": null, n1: n1};
  core::Map<Never, Never> m4 = block {
    final core::Map<Never, Never> #t30 = <Never, Never>{};
    final core::Map<Never, Never>? #t31 = n2;
    if(!#t31.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t31{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t32 = :sync-for-iterator.{core::Iterator::current};
        #t30.{core::Map::[]=}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
      }
    }
    #t30.{core::Map::[]=}(n1, n1);
  } =>#t30;
  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
  var m5 = {...n3, n1: n1};
               ^": null, n1: n1};
  core::Map<Never, Never> m6 = block {
    final core::Map<Never, Never> #t33 = <Never, Never>{};
    final core::Map<Never, Never>? #t34 = n3;
    if(!#t34.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t34{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t35 = :sync-for-iterator.{core::Iterator::current};
        #t33.{core::Map::[]=}(#t35.{core::MapEntry::key}, #t35.{core::MapEntry::value});
      }
    }
    #t33.{core::Map::[]=}(n1, n1);
  } =>#t33;
}
static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
  core::List<Never> l1 = block {
    final core::List<Never> #t36 = <Never>[];
    for (final Never #t37 in n1)
      #t36.{core::List::add}(#t37);
  } =>#t36;
  core::List<Never> l2 = block {
    final core::List<Never> #t38 = <Never>[];
    final core::Iterable<Never>? #t39 = n1;
    if(!#t39.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t39{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t40 = :sync-for-iterator.{core::Iterator::current};
        #t38.{core::List::add}(#t40);
      }
    }
  } =>#t38;
  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
  var l3 = [...n2];
               ^"];
  core::List<Never> l4 = block {
    final core::List<Never> #t41 = <Never>[];
    final core::Iterable<Never>? #t42 = n2;
    if(!#t42.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t42{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t43 = :sync-for-iterator.{core::Iterator::current};
        #t41.{core::List::add}(#t43);
      }
    }
  } =>#t41;
  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
  var l5 = [...n3];
               ^"];
  core::List<Never> l6 = block {
    final core::List<Never> #t44 = <Never>[];
    final core::Iterable<Never>? #t45 = n3;
    if(!#t45.{core::Object::==}(null)) {
      core::Iterator<Never> :sync-for-iterator = #t45{core::Iterable<Never>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final Never #t46 = :sync-for-iterator.{core::Iterator::current};
        #t44.{core::List::add}(#t46);
      }
    }
  } =>#t44;
  core::Set<self::test2::N1> s1 = block {
    final core::Set<self::test2::N1> #t47 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    for (final self::test2::N1 #t48 in n1)
      #t47.{core::Set::add}(#t48);
    #t47.{core::Set::add}(n1);
  } =>#t47;
  core::Set<self::test2::N1> s2 = block {
    final core::Set<self::test2::N1> #t49 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    final core::Iterable<self::test2::N1>? #t50 = n1;
    if(!#t50.{core::Object::==}(null)) {
      core::Iterator<self::test2::N1> :sync-for-iterator = #t50{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final self::test2::N1 #t51 = :sync-for-iterator.{core::Iterator::current};
        #t49.{core::Set::add}(#t51);
      }
    }
    #t49.{core::Set::add}(n1);
  } =>#t49;
  core::Set<dynamic> s3 = block {
    final core::Set<dynamic> #t52 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t52.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
  var s3 = {...n2, n1};
               ^");
    #t52.{core::Set::add}(n1);
  } =>#t52;
  core::Set<self::test2::N1> s4 = block {
    final core::Set<self::test2::N1> #t53 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    final core::Iterable<self::test2::N1>? #t54 = n2;
    if(!#t54.{core::Object::==}(null)) {
      core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final self::test2::N1 #t55 = :sync-for-iterator.{core::Iterator::current};
        #t53.{core::Set::add}(#t55);
      }
    }
    #t53.{core::Set::add}(n1);
  } =>#t53;
  core::Set<dynamic> s5 = block {
    final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
  var s5 = {...n3, n1};
               ^");
    #t56.{core::Set::add}(n1);
  } =>#t56;
  core::Set<self::test2::N1> s6 = block {
    final core::Set<self::test2::N1> #t57 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    final core::Iterable<self::test2::N1>? #t58 = n3;
    if(!#t58.{core::Object::==}(null)) {
      core::Iterator<self::test2::N1> :sync-for-iterator = #t58{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final self::test2::N1 #t59 = :sync-for-iterator.{core::Iterator::current};
        #t57.{core::Set::add}(#t59);
      }
    }
    #t57.{core::Set::add}(n1);
  } =>#t57;
  core::Map<self::test2::N1, self::test2::N1> m1 = block {
    final core::Map<self::test2::N1, self::test2::N1> #t60 = <self::test2::N1, self::test2::N1>{};
    {
      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t61 = :sync-for-iterator.{core::Iterator::current};
        #t60.{core::Map::[]=}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
      }
    }
    #t60.{core::Map::[]=}(n1, n1);
  } =>#t60;
  core::Map<self::test2::N1, self::test2::N1> m2 = block {
    final core::Map<self::test2::N1, self::test2::N1> #t62 = <self::test2::N1, self::test2::N1>{};
    final core::Map<self::test2::N1, self::test2::N1>? #t63 = n1;
    if(!#t63.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t63{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t64 = :sync-for-iterator.{core::Iterator::current};
        #t62.{core::Map::[]=}(#t64.{core::MapEntry::key}, #t64.{core::MapEntry::value});
      }
    }
    #t62.{core::Map::[]=}(n1, n1);
  } =>#t62;
  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
  var m3 = {...n2, n1: n1};
               ^": null, n1: n1};
  core::Map<self::test2::N1, self::test2::N1> m4 = block {
    final core::Map<self::test2::N1, self::test2::N1> #t65 = <self::test2::N1, self::test2::N1>{};
    final core::Map<self::test2::N1, self::test2::N1>? #t66 = n2;
    if(!#t66.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t66{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t67 = :sync-for-iterator.{core::Iterator::current};
        #t65.{core::Map::[]=}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
      }
    }
    #t65.{core::Map::[]=}(n1, n1);
  } =>#t65;
  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
  var m5 = {...n3, n1: n1};
               ^": null, n1: n1};
  core::Map<self::test2::N1, self::test2::N1> m6 = block {
    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
    final core::Map<self::test2::N1, self::test2::N1>? #t69 = n3;
    if(!#t69.{core::Object::==}(null)) {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t69{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t70 = :sync-for-iterator.{core::Iterator::current};
        #t68.{core::Map::[]=}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
      }
    }
    #t68.{core::Map::[]=}(n1, n1);
  } =>#t68;
}
static method main() → dynamic {}
