library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/late_lowering/later.dart:14:7: Error: Can't have modifier 'late' here.
// Try removing 'late'.
//   foo(late int x) {} // Error.
//       ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:17:5: Error: Can't have modifier 'late' here.
// Try removing 'late'.
// bar(late int x) {} // Error.
//     ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:22:28: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
// No types are needed, the first is given by 'on', the second is always 'StackTrace'.
//   } on dynamic catch (late e, late t) {} // Error.
//                            ^
//
// pkg/front_end/testcases/late_lowering/later.dart:22:31: Error: Can't have modifier 'late' here.
// Try removing 'late'.
//   } on dynamic catch (late e, late t) {} // Error.
//                               ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:22:36: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
// No types are needed, the first is given by 'on', the second is always 'StackTrace'.
//   } on dynamic catch (late e, late t) {} // Error.
//                                    ^
//
// pkg/front_end/testcases/late_lowering/later.dart:23:8: Error: Can't have modifier 'late' here.
// Try removing 'late'.
//   for (late int i = 0; i < 10; ++i) { // Error.
//        ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:26:8: Error: Can't have modifier 'late' here.
// Try removing 'late'.
//   for (late String s in ["baz"]) { // Error.
//        ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:29:9: Error: Can't have modifier 'late' here.
// Try removing 'late'.
//   [for (late int i = 0; i < 10; ++i) i]; // Error.
//         ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:33:14: Error: Can't have modifier 'late' here.
// Try removing 'late'.
//   await for (late String s in new Stream.fromIterable(["hest"])) { // Error.
//              ^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:40:20: Error: `await` expressions are not supported in late local initializers.
//   late String s1 = await hest(); // Error.
//                    ^^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:41:30: Error: `await` expressions are not supported in late local initializers.
//   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
//                              ^^^^^
//
// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
//   late final int x = 42;
//                  ^
// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
//   const B(); // Error: B has late final fields.
//         ^
//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
import "dart:async" as asy;

class A extends core::Object {
  field core::int a = 42;
  field core::int? _#A#b = null;
  field core::bool _#A#b#isSet = false;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get b() → core::int {
    if(!this.{self::A::_#A#b#isSet}{core::bool}) {
      this.{self::A::_#A#b} = this.{self::A::a}{core::int}.{core::num::*}(2){(core::num) → core::int}.{core::int::>>}(1){(core::int) → core::int};
      this.{self::A::_#A#b#isSet} = true;
    }
    return let final core::int? #t1 = this.{self::A::_#A#b}{core::int?} in #t1{core::int};
  }
  set b(core::int b#param) → void {
    this.{self::A::_#A#b#isSet} = true;
    this.{self::A::_#A#b} = b#param;
  }
  method foo(core::int x) → dynamic {}
}
class B extends core::Object /*hasConstConstructor*/  {
  field core::int? _#B#x = null;
  field core::bool _#B#x#isSet = false;
  const constructor •() → self::B
    : super core::Object::•()
    ;
  get x() → core::int {
    if(!this.{self::B::_#B#x#isSet}{core::bool}) {
      final core::int #t2 = 42;
      if(this.{self::B::_#B#x#isSet}{core::bool})
        throw new _in::LateError::fieldADI("x");
      this.{self::B::_#B#x} = #t2;
      this.{self::B::_#B#x#isSet} = true;
    }
    return let final core::int? #t3 = this.{self::B::_#B#x}{core::int?} in #t3{core::int};
  }
}
class C extends core::Object {
  field core::int? _#C#x = null;
  field core::bool _#C#x#isSet = false;
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  get x() → core::int
    return this.{self::C::_#C#x#isSet}{core::bool} ?{core::int} let final core::int? #t4 = this.{self::C::_#C#x}{core::int?} in #t4{core::int} : throw new _in::LateError::fieldNI("x");
  set x(core::int x#param) → void
    if(this.{self::C::_#C#x#isSet}{core::bool})
      throw new _in::LateError::fieldAI("x");
    else {
      this.{self::C::_#C#x#isSet} = true;
      this.{self::C::_#C#x} = x#param;
    }
  method initVars() → dynamic {
    this.{self::C::x} = 42;
  }
}
static method bar(core::int x) → dynamic {}
static method baz() → dynamic {
  {
    {
      invalid-expression "pkg/front_end/testcases/late_lowering/later.dart:22:36: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
No types are needed, the first is given by 'on', the second is always 'StackTrace'.
  } on dynamic catch (late e, late t) {} // Error.
                                   ^";
    }
    try {
      throw "baz";
    }
    on dynamic catch(final dynamic late, final core::StackTrace e) {
    }
  }
  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
    core::print("baz");
  }
  {
    core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>("baz").{core::Iterable::iterator}{core::Iterator<core::String>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      core::String s = :sync-for-iterator.{core::Iterator::current}{core::String};
      {
        core::print(s);
      }
    }
  }
  block {
    final core::List<core::int> #t5 = core::_GrowableList::•<core::int>(0);
    for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      #t5.{core::List::add}{Invariant}(i){(core::int) → void};
  } =>#t5;
}
static method hest() → dynamic /* originally async */ {
  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  FutureOr<dynamic>? :return_value;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        {
          asy::Stream<core::String> :stream = asy::Stream::fromIterable<core::String>(core::_GrowableList::_literal1<core::String>("hest"));
          asy::_StreamIterator<core::String>? :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
          try
            #L2:
            while (true) {
              dynamic #t6 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                core::String s = :for-iterator.{asy::_StreamIterator::current}{core::String};
                {
                  core::print(s);
                }
              }
              else
                break #L2;
            }
          finally
            if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<core::String>?} == null)) {
              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>}, :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        :return_value = "hest";
        break #L1;
      }
      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
      return;
    }
    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_op(){() → dynamic};
  :is_sync = true;
  return :async_future;
}
static method fisk() → dynamic /* originally async */ {
  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  FutureOr<dynamic>? :return_value;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L3:
      {
        lowered core::String? #s1;
        lowered core::bool #s1#isSet = false;
        function #s1#get() → core::String {
          if(!#s1#isSet) {
            #s1 = invalid-expression "pkg/front_end/testcases/late_lowering/later.dart:40:20: Error: `await` expressions are not supported in late local initializers.
  late String s1 = await hest(); // Error.
                   ^^^^^";
            #s1#isSet = true;
          }
          return #s1{core::String};
        }
        function #s1#set(core::String s1#param) → dynamic {
          #s1#isSet = true;
          return #s1 = s1#param;
        }
        lowered core::String? #s2;
        lowered core::bool #s2#isSet = false;
        function #s2#get() → core::String {
          if(!#s2#isSet) {
            #s2 = "${#C1}${invalid-expression "pkg/front_end/testcases/late_lowering/later.dart:41:30: Error: `await` expressions are not supported in late local initializers.
  late String s2 = '\${fisk}\${await hest()}\${fisk}'; // Error.
                             ^^^^^"}${#C1}";
            #s2#isSet = true;
          }
          return #s2{core::String};
        }
        function #s2#set(core::String s2#param) → dynamic {
          #s2#isSet = true;
          return #s2 = s2#param;
        }
        lowered core::Function? #f;
        lowered core::bool #f#isSet = false;
        function #f#get() → core::Function {
          if(!#f#isSet) {
            #f = () → asy::Future<dynamic> /* originally async */ {
              final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
              core::bool* :is_sync = false;
              FutureOr<dynamic>? :return_value;
              (dynamic) → dynamic :async_op_then;
              (core::Object, core::StackTrace) → dynamic :async_op_error;
              core::int :await_jump_var = 0;
              dynamic :await_ctx_var;
              dynamic :saved_try_context_var0;
              function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
                try {
                  #L4:
                  {
                    [yield] let dynamic #t9 = asy::_awaitHelper(self::hest(), :async_op_then, :async_op_error, :async_op) in null;
                    :return_value = :result;
                    break #L4;
                  }
                  asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                  return;
                }
                on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
                  asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
                }
              :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
              :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
              :async_op(){() → dynamic};
              :is_sync = true;
              return :async_future;
            };
            #f#isSet = true;
          }
          return #f{core::Function};
        }
        function #f#set(core::Function f#param) → dynamic {
          #f#isSet = true;
          return #f = f#param;
        }
      }
      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
      return;
    }
    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_op(){() → dynamic};
  :is_sync = true;
  return :async_future;
}
static method main() → dynamic {}

constants  {
  #C1 = static-tearoff self::fisk
}
