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