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 = core::List::of<Never>(n1);
  } =>#t1;
  core::List<Never> l2 = block {
    final core::List<Never> #t2 = core::_GrowableList::•<Never>(0);
    final core::Iterable<Never>? #t3 = n1;
    if(!(#t3 == null))
      #t2.{core::List::addAll}(#t3{core::Iterable<Never>}){(core::Iterable<Never>) → void};
  } =>#t2;
  core::List<dynamic> l3 = core::_GrowableList::_literal1<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> #t4 = core::_GrowableList::•<Never>(0);
    final core::Iterable<Never>? #t5 = n2;
    if(!(#t5 == null))
      #t4.{core::List::addAll}(#t5{core::Iterable<Never>}){(core::Iterable<Never>) → void};
  } =>#t4;
  core::List<dynamic> l5 = core::_GrowableList::_literal1<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> #t6 = core::_GrowableList::•<Never>(0);
    final core::Iterable<Never>? #t7 = n3;
    if(!(#t7 == null))
      #t6.{core::List::addAll}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
  } =>#t6;
  core::Set<Never> s1 = block {
    final core::Set<Never> #t8 = col::LinkedHashSet::of<Never>(n1);
    #t8.{core::Set::add}(n1){(Never) → core::bool};
  } =>#t8;
  core::Set<Never> s2 = block {
    final core::Set<Never> #t9 = new col::_CompactLinkedHashSet::•<Never>();
    final core::Iterable<Never>? #t10 = n1;
    if(!(#t10 == null))
      #t9.{core::Set::addAll}(#t10{core::Iterable<Never>}){(core::Iterable<Never>) → void};
    #t9.{core::Set::add}(n1){(Never) → core::bool};
  } =>#t9;
  core::Set<dynamic> s3 = block {
    final core::Set<dynamic> #t11 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t11.{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};
               ^"){(dynamic) → core::bool};
    #t11.{core::Set::add}(n1){(dynamic) → core::bool};
  } =>#t11;
  core::Set<Never> s4 = block {
    final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
    final core::Iterable<Never>? #t13 = n2;
    if(!(#t13 == null))
      #t12.{core::Set::addAll}(#t13{core::Iterable<Never>}){(core::Iterable<Never>) → void};
    #t12.{core::Set::add}(n1){(Never) → core::bool};
  } =>#t12;
  core::Set<dynamic> s5 = block {
    final core::Set<dynamic> #t14 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t14.{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};
               ^"){(dynamic) → core::bool};
    #t14.{core::Set::add}(n1){(dynamic) → core::bool};
  } =>#t14;
  core::Set<Never> s6 = block {
    final core::Set<Never> #t15 = new col::_CompactLinkedHashSet::•<Never>();
    final core::Iterable<Never>? #t16 = n3;
    if(!(#t16 == null))
      #t15.{core::Set::addAll}(#t16{core::Iterable<Never>}){(core::Iterable<Never>) → void};
    #t15.{core::Set::add}(n1){(Never) → core::bool};
  } =>#t15;
  core::Map<Never, Never> m1 = block {
    final core::Map<Never, Never> #t17 = <Never, Never>{};
    {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = n1.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t18 = :sync-for-iterator.{core::Iterator::current};
        #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}{Never}, #t18.{core::MapEntry::value}{Never}){(Never, Never) → void};
      }
    }
    #t17.{core::Map::[]=}(n1, n1){(Never, Never) → void};
  } =>#t17;
  core::Map<Never, Never> m2 = block {
    final core::Map<Never, Never> #t19 = <Never, Never>{};
    final core::Map<Never, Never>? #t20 = n1;
    if(!(#t20 == null)) {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t20{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t21 = :sync-for-iterator.{core::Iterator::current};
        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}{Never}, #t21.{core::MapEntry::value}{Never}){(Never, Never) → void};
      }
    }
    #t19.{core::Map::[]=}(n1, n1){(Never, Never) → void};
  } =>#t19;
  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> #t22 = <Never, Never>{};
    final core::Map<Never, Never>? #t23 = n2;
    if(!(#t23 == null)) {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t23{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t24 = :sync-for-iterator.{core::Iterator::current};
        #t22.{core::Map::[]=}(#t24.{core::MapEntry::key}{Never}, #t24.{core::MapEntry::value}{Never}){(Never, Never) → void};
      }
    }
    #t22.{core::Map::[]=}(n1, n1){(Never, Never) → void};
  } =>#t22;
  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> #t25 = <Never, Never>{};
    final core::Map<Never, Never>? #t26 = n3;
    if(!(#t26 == null)) {
      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t26{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<Never, Never> #t27 = :sync-for-iterator.{core::Iterator::current};
        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{Never}, #t27.{core::MapEntry::value}{Never}){(Never, Never) → void};
      }
    }
    #t25.{core::Map::[]=}(n1, n1){(Never, Never) → void};
  } =>#t25;
}
static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
  core::List<Never> l1 = block {
    final core::List<Never> #t28 = core::List::of<Never>(n1);
  } =>#t28;
  core::List<Never> l2 = block {
    final core::List<Never> #t29 = core::_GrowableList::•<Never>(0);
    final core::Iterable<Never>? #t30 = n1;
    if(!(#t30 == null))
      #t29.{core::List::addAll}(#t30{core::Iterable<Never>}){(core::Iterable<Never>) → void};
  } =>#t29;
  core::List<dynamic> l3 = core::_GrowableList::_literal1<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> #t31 = core::_GrowableList::•<Never>(0);
    final core::Iterable<Never>? #t32 = n2;
    if(!(#t32 == null))
      #t31.{core::List::addAll}(#t32{core::Iterable<Never>}){(core::Iterable<Never>) → void};
  } =>#t31;
  core::List<dynamic> l5 = core::_GrowableList::_literal1<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> #t33 = core::_GrowableList::•<Never>(0);
    final core::Iterable<Never>? #t34 = n3;
    if(!(#t34 == null))
      #t33.{core::List::addAll}(#t34{core::Iterable<Never>}){(core::Iterable<Never>) → void};
  } =>#t33;
  core::Set<self::test2::N1> s1 = block {
    final core::Set<self::test2::N1> #t35 = col::LinkedHashSet::of<self::test2::N1>(n1);
    #t35.{core::Set::add}(n1){(self::test2::N1) → core::bool};
  } =>#t35;
  core::Set<self::test2::N1> s2 = block {
    final core::Set<self::test2::N1> #t36 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    final core::Iterable<self::test2::N1>? #t37 = n1;
    if(!(#t37 == null))
      #t36.{core::Set::addAll}(#t37{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
    #t36.{core::Set::add}(n1){(self::test2::N1) → core::bool};
  } =>#t36;
  core::Set<dynamic> s3 = block {
    final core::Set<dynamic> #t38 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t38.{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};
               ^"){(dynamic) → core::bool};
    #t38.{core::Set::add}(n1){(dynamic) → core::bool};
  } =>#t38;
  core::Set<self::test2::N1> s4 = block {
    final core::Set<self::test2::N1> #t39 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    final core::Iterable<self::test2::N1>? #t40 = n2;
    if(!(#t40 == null))
      #t39.{core::Set::addAll}(#t40{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
    #t39.{core::Set::add}(n1){(self::test2::N1) → core::bool};
  } =>#t39;
  core::Set<dynamic> s5 = block {
    final core::Set<dynamic> #t41 = new col::_CompactLinkedHashSet::•<dynamic>();
    #t41.{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};
               ^"){(dynamic) → core::bool};
    #t41.{core::Set::add}(n1){(dynamic) → core::bool};
  } =>#t41;
  core::Set<self::test2::N1> s6 = block {
    final core::Set<self::test2::N1> #t42 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
    final core::Iterable<self::test2::N1>? #t43 = n3;
    if(!(#t43 == null))
      #t42.{core::Set::addAll}(#t43{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
    #t42.{core::Set::add}(n1){(self::test2::N1) → core::bool};
  } =>#t42;
  core::Map<self::test2::N1, self::test2::N1> m1 = block {
    final core::Map<self::test2::N1, self::test2::N1> #t44 = <self::test2::N1, self::test2::N1>{};
    {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = n1.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t45 = :sync-for-iterator.{core::Iterator::current};
        #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}{self::test2::N1}, #t45.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
      }
    }
    #t44.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
  } =>#t44;
  core::Map<self::test2::N1, self::test2::N1> m2 = block {
    final core::Map<self::test2::N1, self::test2::N1> #t46 = <self::test2::N1, self::test2::N1>{};
    final core::Map<self::test2::N1, self::test2::N1>? #t47 = n1;
    if(!(#t47 == null)) {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t47{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t48 = :sync-for-iterator.{core::Iterator::current};
        #t46.{core::Map::[]=}(#t48.{core::MapEntry::key}{self::test2::N1}, #t48.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
      }
    }
    #t46.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
  } =>#t46;
  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> #t49 = <self::test2::N1, self::test2::N1>{};
    final core::Map<self::test2::N1, self::test2::N1>? #t50 = n2;
    if(!(#t50 == null)) {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t50{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t51 = :sync-for-iterator.{core::Iterator::current};
        #t49.{core::Map::[]=}(#t51.{core::MapEntry::key}{self::test2::N1}, #t51.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
      }
    }
    #t49.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
  } =>#t49;
  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> #t52 = <self::test2::N1, self::test2::N1>{};
    final core::Map<self::test2::N1, self::test2::N1>? #t53 = n3;
    if(!(#t53 == null)) {
      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t53{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<self::test2::N1, self::test2::N1> #t54 = :sync-for-iterator.{core::Iterator::current};
        #t52.{core::Map::[]=}(#t54.{core::MapEntry::key}{self::test2::N1}, #t54.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
      }
    }
    #t52.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
  } =>#t52;
}
static method main() → dynamic {}
