library;
//
// 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:48:9: Warning: Constructor is marked 'const' and some fields are late.
//   const B(); // Error: B has late final fields.
//         ^
// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
//   late final int x = 42;
//                  ^
//
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;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  get b() → core::int
    return let final core::int? #t1 = this.{self::A::_#A#b} in #t1.==(null) ?{core::int} this.{self::A::_#A#b} = this.{self::A::a}.{core::num::*}(2).{core::int::>>}(1) : #t1{core::int};
  set b(core::int #t2) → void
    this.{self::A::_#A#b} = #t2;
  method foo(core::int x) → dynamic {}
}
class B extends core::Object {
  field core::int? _#B#x = null;
  const constructor •() → self::B
    : super core::Object::•()
    ;
  get x() → core::int
    return let final core::int? #t3 = this.{self::B::_#B#x} in #t3.==(null) ?{core::int} let final core::int #t4 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.") : #t3{core::int};
}
class C extends core::Object {
  field core::int? _#C#x = null;
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  get x() → core::int
    return let final core::int? #t5 = this.{self::C::_#C#x} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t5{core::int};
  set x(core::int #t6) → void
    if(this.{self::C::_#C#x}.==(null))
      this.{self::C::_#C#x} = #t6;
    else
      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
  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); i = i.{core::num::+}(1)) {
    core::print("baz");
  }
  {
    core::Iterator<core::String*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::String*>*>(<core::String>["baz"]).{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      core::String s = :sync-for-iterator.{core::Iterator::current};
      {
        core::print(s);
      }
    }
  }
  block {
    final core::List<core::int> #t7 = <core::int>[];
    for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
      #t7.{core::List::add}(i);
  } =>#t7;
}
static method hest() → dynamic /* originally async */ {
  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
  asy::FutureOr<dynamic>? :return_value;
  dynamic :async_stack_trace;
  dynamic :async_op_then;
  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:
      {
        {
          dynamic :stream = asy::Stream::fromIterable<core::String>(<core::String>["hest"]);
          asy::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::String>? :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
          try
            #L2:
            while (true) {
              dynamic #t8 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t9 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :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::print(s);
                }
              }
              else
                break #L2;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        :return_value = "hest";
        break #L1;
      }
      asy::_completeOnAsyncReturn(:async_completer, :return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
    }
  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_completer.start(:async_op);
  return :async_completer.{asy::Completer::future};
}
static method fisk() → dynamic /* originally async */ {
  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
  asy::FutureOr<dynamic>? :return_value;
  dynamic :async_stack_trace;
  dynamic :async_op_then;
  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:
      {
        core::String? s1;
        function #s1#get() → core::String
          return let final core::String? #t11 = s1 in #t11.==(null) ?{core::String} 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.
                   ^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::String : #t11{core::String};
        function #s1#set(core::String #t12) → dynamic
          return s1 = #t12;
        core::String? s2;
        function #s2#get() → core::String
          return let final core::String? #t13 = s2 in #t13.==(null) ?{core::String} 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}" : #t13{core::String};
        function #s2#set(core::String #t14) → dynamic
          return s2 = #t14;
        core::Function? f;
        function #f#get() → core::Function
          return let final core::Function? #t15 = f in #t15.==(null) ?{core::Function} f = () → asy::Future<dynamic> /* originally async */ {
            final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
            asy::FutureOr<dynamic>? :return_value;
            dynamic :async_stack_trace;
            dynamic :async_op_then;
            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 #t16 = asy::_awaitHelper(self::hest(), :async_op_then, :async_op_error, :async_op) in null;
                  :return_value = :result;
                  break #L4;
                }
                asy::_completeOnAsyncReturn(:async_completer, :return_value);
                return;
              }
              on dynamic catch(dynamic :exception, dynamic :stack_trace) {
                :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
              }
            :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
            :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
            :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
            :async_completer.start(:async_op);
            return :async_completer.{asy::Completer::future};
          } : #t15{core::Function};
        function #f#set(core::Function #t17) → dynamic
          return f = #t17;
      }
      asy::_completeOnAsyncReturn(:async_completer, :return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
    }
  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_completer.start(:async_op);
  return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}

constants  {
  #C1 = tearoff self::fisk
}
