library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

static method main() → dynamic {
  final core::List<core::int*>* aList = block {
    final core::List<core::int*>* #t1 = <core::int*>[];
    #t1.{core::List::add}{Invariant}(1);
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      #t1.{core::List::add}{Invariant}(2);
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      #t1.{core::List::add}{Invariant}(3);
    else
      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}());
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
        #t1.{core::List::add}{Invariant}(4);
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        #t1.{core::List::add}{Invariant}(i);
      }
    }
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[8, 9, 10].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        if(self::oracle() as{TypeError,ForDynamic} core::bool*)
          #t1.{core::List::add}{Invariant}(i);
      }
    }
    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
      #t1.{core::List::add}{Invariant}(i);
  } =>#t1;
  final core::Set<core::int*>* aSet = block {
    final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
    #t2.{core::Set::add}{Invariant}(1);
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      #t2.{core::Set::add}{Invariant}(2);
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      #t2.{core::Set::add}{Invariant}(3);
    else
      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}());
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
        #t2.{core::Set::add}{Invariant}(4);
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        #t2.{core::Set::add}{Invariant}(i);
      }
    }
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[8, 9, 10].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        if(self::oracle() as{TypeError,ForDynamic} core::bool*)
          #t2.{core::Set::add}{Invariant}(i);
      }
    }
    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
      #t2.{core::Set::add}{Invariant}(i);
  } =>#t2;
  final core::Map<core::int*, core::int*>* aMap = block {
    final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
    #t3.{core::Map::[]=}{Invariant}(1, 1);
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      #t3.{core::Map::[]=}{Invariant}(2, 2);
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      #t3.{core::Map::[]=}{Invariant}(3, 3);
    else
      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(), 1.{core::int::unary-}());
    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
        #t3.{core::Map::[]=}{Invariant}(4, 4);
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        #t3.{core::Map::[]=}{Invariant}(i, i);
      }
    }
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[8, 9, 10].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        if(self::oracle() as{TypeError,ForDynamic} core::bool*)
          #t3.{core::Map::[]=}{Invariant}(i, i);
      }
    }
    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
      #t3.{core::Map::[]=}{Invariant}(i, i);
  } =>#t3;
  core::print(aList);
  core::print(aSet);
  core::print(aMap);
}
static method oracle() → dynamic
  return true;


Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:9:26 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:18:26 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:27:29 -> IntConstant(-1)
Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:27:33 -> IntConstant(-1)
Extra constant evaluation: evaluated: 160, effectively constant: 4
