library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

class A<T extends core::Object? = dynamic> extends core::Object {
  generic-covariant-impl field self::A::T? _#A#x = null;
  field core::bool _#A#x#isSet = false;
  synthetic constructor •() → self::A<self::A::T%>
    : super core::Object::•()
    ;
  get x() → self::A::T%
    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
  set x(generic-covariant-impl self::A::T% #t2) → void {
    this.{self::A::_#A#x#isSet} = true;
    this.{self::A::_#A#x} = #t2;
  }
}
class B<T extends core::Object? = dynamic> extends core::Object {
  generic-covariant-impl field self::B::T? _y = null;
  synthetic constructor •() → self::B<self::B::T%>
    : super core::Object::•()
    ;
  get y() → self::B::T?
    return this.{self::B::_y};
  set y(generic-covariant-impl self::B::T? val) → void {
    this.{self::B::_y} = val;
  }
}
static method main() → dynamic {
  self::A<core::num> a = new self::A::•<core::int>();
  self::expect(42, a.{self::A::x} = 42);
  self::throws(() → core::double => a.{self::A::x} = 0.5);
  self::B<core::num> b = new self::B::•<core::int>();
  self::expect(42, b.{self::B::y} = 42);
  self::throws(() → core::double => b.{self::B::y} = 0.5);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → dynamic {
  try {
    f.call();
  }
  on core::Object catch(final core::Object _) {
    return;
  }
  throw "Expected exception";
}
