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

typedef E<invariant T extends core::Object? = dynamic> = (T%) → T%;
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class B extends core::Object implements self::A {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
}
class C extends core::Object implements self::A {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
}
class D extends core::Object implements self::B, self::C {
  synthetic constructor •() → self::D
    : super core::Object::•()
    ;
}
class Rt<T extends core::Object? = dynamic> extends core::Object {
  constructor •(self::Rt::T% t) → self::Rt<self::Rt::T%>
    : super core::Object::•()
    ;
  method rt<covariant-by-class T2 extends (self::Rt::T%) → self::Rt::T%>() → void {}
}
extension St<T extends core::Object? = dynamic> on T% {
  method st = self::St|st;
  method tearoff st = self::St|get#st;
}
static method main() → void {
  self::foo<core::Object>(false, new self::D::•(), new self::D::•());
}
static method foo<X extends core::Object? = dynamic>(core::bool not, self::foo::X% b, self::foo::X% c) → void {
  if(!(b is self::B))
    return;
  {
    self::foo::X% v1 = b{self::foo::X% & self::B /* '%' & '!' = '!' */};
    self::B v2 = b{self::foo::X% & self::B /* '%' & '!' = '!' */};
  }
  if(!(c is self::C))
    return;
  {
    self::foo::X% v1 = c{self::foo::X% & self::C /* '%' & '!' = '!' */};
    self::C v2 = c{self::foo::X% & self::C /* '%' & '!' = '!' */};
  }
  self::foo::X% bc = not ?{self::foo::X%} b{self::foo::X% & self::B /* '%' & '!' = '!' */} : c{self::foo::X% & self::C /* '%' & '!' = '!' */};
  {
    self::foo::X% v1 = bc;
    if(not) {
      bc = 0 as self::foo::X%;
      throw "never got here, never go back";
    }
  }
  self::St|get#st<self::foo::X%>(bc)<(self::foo::X%) → self::foo::X%>;
  self::St|get#st<self::foo::X%>(bc)<(self::foo::X%) → self::foo::X%>;
  (new self::Rt::•<self::foo::X%>(bc).{self::Rt::rt}{<T2 extends (self::foo::X%) → self::foo::X%>() → void} as{TypeError,CovarianceCheck} <T2 extends (self::foo::X%) → self::foo::X%>() → void)<(self::foo::X%) → self::foo::X%>;
}
static extension-member method St|st<T extends core::Object? = dynamic, T2 extends (self::St|st::T%) → self::St|st::T% = (dynamic) → dynamic>(lowered final self::St|st::T% #this) → void {}
static extension-member method St|get#st<T extends core::Object? = dynamic>(lowered final self::St|get#st::T% #this) → <T2 extends (self::St|get#st::T%) → self::St|get#st::T% = (dynamic) → dynamic>() → void
  return <T2 extends (self::St|get#st::T%) → self::St|get#st::T% = (dynamic) → dynamic>() → void => self::St|st<self::St|get#st::T%, T2>(#this);
