| 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); |