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.
//     ^^^^
//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

class A extends core::Object {
  field core::int a;
  field core::int? _#A#b;
  field core::bool _#A#b#isSet;
  synthetic constructor •() → self::A
    ;
  get b() → core::int;
  set b(core::int #t1) → void;
  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}) {
      final core::int #t2 = 42;
      if(this.{self::B::_#B#x#isSet})
        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} in #t3{core::int};
  }
}
class C extends core::Object {
  field core::int? _#C#x;
  field core::bool _#C#x#isSet;
  synthetic constructor •() → self::C
    ;
  get x() → core::int;
  set x(core::int #t4) → void;
  method initVars() → dynamic
    ;
}
static method bar(core::int x) → dynamic
  ;
static method baz() → dynamic
  ;
static method hest() → dynamic async 
  ;
static method fisk() → dynamic async 
  ;
static method main() → dynamic
  ;
