library;
//
// Problems in library:
//
// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:28:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
//  - 'List' is from 'dart:core'.
//     [1]
//     ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
//     ..first.last.toString()
//             ^^^^
//
// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
// Try correcting the operator to an existing operator, or defining a '[]' operator.
//     ..first[0].toString()
//            ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
//     ..[0].last.toString();
//           ^^^^
//
import self as self;
import "dart:core" as core;

static method main() → dynamic {
  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = core::_GrowableList::_literal1<core::int*>(1) in block {
    #t1.{core::List::add}(2);
    #t1.{core::List::add}(3);
    #t1.{core::List::addAll}(core::_GrowableList::_literal2<core::int*>(4, 5));
  } =>#t1;
  core::print(list);
  let final core::List<core::int*>* #t2 = list in block {
    #t2.{core::List::add}(2);
    #t2.{core::List::length};
    #t2.{core::List::length} = 0;
  } =>#t2;
  core::print(list);
  let final core::List<core::int*>* #t3 = list in block {
    #t3.{core::List::add}(2);
    #t3.{core::List::[]}(0);
    #t3.{core::List::[]=}(0, 87);
  } =>#t3;
  core::print(list);
  list = let final core::List<core::int*>* #t4 = core::_GrowableList::_literal1<core::int*>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:28:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
 - 'List' is from 'dart:core'.
    [1]
    ^" in core::_GrowableList::_literal1<core::int*>(1) as{TypeError} core::int*) in block {
    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
    ..first.last.toString()
            ^^^^".{core::Object::toString}();
    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
Try correcting the operator to an existing operator, or defining a '[]' operator.
    ..first[0].toString()
           ^".{core::Object::toString}();
    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
    ..[0].last.toString();
          ^^^^".{core::Object::toString}();
  } =>#t4;
  core::print(list);
}
