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

abstract class A<X extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::A<self::A::X%>
    : super core::Object::•()
    ;
  abstract get g() → (self::A::X%) → void;
}
class B extends core::Object implements self::A<core::int> {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  get g() → (core::int) → void
    return (core::int i) → void => let final core::int #t1 = self::callCount in let final void #t2 = self::callCount = #t1.{core::num::+}(1){(core::num) → core::int} in #t1;
}
static field core::int callCount = 0;
static method foo(core::Object o, core::num value) → void {
  #L1:
  {
    final synthesized core::Object #0#0 = o;
    synthesized dynamic #0#2;
    synthesized core::bool #0#2#isSet = false;
    {
      hoisted (core::num) → void f;
      if(#0#0 is self::B && (let final dynamic #t3 = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final dynamic #t4 = #0#2#isSet = true in #0#2 = #0#0{self::B}.{self::B::g}{(core::int) → void} in true) && (let final dynamic #t5 = f = (#0#2#isSet ?{(core::num) → void} #0#2{(core::num) → void} : let final dynamic #t6 = #0#2#isSet = true in #0#2 = #0#0{self::B}.{self::A::g}{(core::num) → void}) as{CovarianceCheck} (core::num) → void in true)) {
        {
          f(value){(core::num) → void};
        }
      }
    }
  }
}
static method main() → void {
  self::expect(0, self::callCount);
  self::throws(() → void => self::foo(new self::B::•(), 25.7));
  self::expect(0, self::callCount);
  self::throws(() → void => self::foo(new self::B::•(), 1));
  self::expect(0, self::callCount);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Expected ${expected}, actual ${actual}";
  }
}
static method throws(() → void f) → dynamic {
  try {
    f(){() → void};
  }
  on core::Object catch(final core::Object e) {
    core::print(e);
    return;
  }
  throw "No exception thrown";
}
