| library; | 
 | // | 
 | // Problems in library: | 
 | // | 
 | // pkg/front_end/testcases/patterns/exhaustiveness/generic_extension_members.dart:49:42: Error: The type 'I<num>' is not exhaustively matched by the switch cases since it doesn't match 'I<num>(member: double())'. | 
 | //  - 'I' is from 'pkg/front_end/testcases/patterns/exhaustiveness/generic_extension_members.dart'. | 
 | // Try adding a wildcard pattern or cases that match 'I<num>(member: double())'. | 
 | // num exhaustiveMixed(I<num> i) => switch (i) { | 
 | //                                          ^ | 
 | // | 
 | import self as self; | 
 | import "dart:core" as core; | 
 |  | 
 | class I<T extends core::Object? = dynamic> extends core::Object { | 
 |   synthetic constructor •() → self::I<self::I::T%> | 
 |     : super core::Object::•() | 
 |     ; | 
 | } | 
 | class J<T extends core::Object? = dynamic> extends self::I<self::J::T%> { | 
 |   synthetic constructor •() → self::J<self::J::T%> | 
 |     : super self::I::•() | 
 |     ; | 
 | } | 
 | class A<T extends core::Object? = dynamic> extends self::J<self::A::T%> { | 
 |   synthetic constructor •() → self::A<self::A::T%> | 
 |     : super self::J::•() | 
 |     ; | 
 | } | 
 | extension /* unnamed */ _extension#0<T extends core::Object? = dynamic> on self::I<T%> { | 
 |   get member = self::_extension#0|get#member; | 
 | } | 
 | extension /* unnamed */ _extension#1<T extends core::Object? = dynamic> on self::A<T%> { | 
 |   method member = self::_extension#1|member; | 
 |   method tearoff member = self::_extension#1|get#member; | 
 | } | 
 | static extension-member method _extension#0|get#member<T extends core::Object? = dynamic>(lowered final self::I<self::_extension#0|get#member::T%> #this) → core::num { | 
 |   return self::_extension#0|get#member::T% =={core::Type::==}{(core::Object) → core::bool} #C1 ?{core::num} 0.5 : 1; | 
 | } | 
 | static extension-member method _extension#1|member<T extends core::Object? = dynamic>(lowered final self::A<self::_extension#1|member::T%> #this, self::_extension#1|member::T% t) → void {} | 
 | static extension-member method _extension#1|get#member<T extends core::Object? = dynamic>(lowered final self::A<self::_extension#1|get#member::T%> #this) → (self::_extension#1|get#member::T%) → void | 
 |   return (self::_extension#1|get#member::T% t) → void => self::_extension#1|member<self::_extension#1|get#member::T%>(#this, t); | 
 | static method exhaustiveInferred(self::A<core::num> a) → dynamic | 
 |   return block { | 
 |     core::int #t1; | 
 |     final synthesized self::A<core::num> #0#0 = a; | 
 |     #L1: | 
 |     { | 
 |       { | 
 |         hoisted (core::int) → void member; | 
 |         if(#0#0 is self::A<core::int>) { | 
 |           member = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); | 
 |           #t1 = 0; | 
 |           break #L1; | 
 |         } | 
 |       } | 
 |       { | 
 |         hoisted (core::num) → void member; | 
 |         if(true) { | 
 |           member = self::_extension#1|get#member<core::num>(#0#0); | 
 |           #t1 = 1; | 
 |           break #L1; | 
 |         } | 
 |       } | 
 |     } | 
 |   } =>#t1; | 
 | static method exhaustiveTyped(self::A<core::num> a) → dynamic | 
 |   return block { | 
 |     core::int #t2; | 
 |     final synthesized self::A<core::num> #0#0 = a; | 
 |     synthesized (core::int) → void #0#2; | 
 |     synthesized core::bool #0#2#isSet = false; | 
 |     synthesized (core::num) → void #0#3; | 
 |     synthesized core::bool #0#3#isSet = false; | 
 |     #L2: | 
 |     { | 
 |       { | 
 |         hoisted (core::int) → void member; | 
 |         if(#0#0 is self::A<core::int> && (#0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final dynamic #t3 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>})) is (core::int) → void) { | 
 |           member = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final dynamic #t4 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); | 
 |           #t2 = 0; | 
 |           break #L2; | 
 |         } | 
 |       } | 
 |       { | 
 |         hoisted (core::num) → void member; | 
 |         if((#0#3#isSet ?{(core::num) → void} #0#3{(core::num) → void} : let final dynamic #t5 = #0#3#isSet = true in #0#3 = self::_extension#1|get#member<core::num>(#0#0)) is (core::num) → void) { | 
 |           member = #0#3#isSet ?{(core::num) → void} #0#3{(core::num) → void} : let final dynamic #t6 = #0#3#isSet = true in #0#3 = self::_extension#1|get#member<core::num>(#0#0); | 
 |           #t2 = 1; | 
 |           break #L2; | 
 |         } | 
 |       } | 
 |     } | 
 |   } =>#t2; | 
 | static method unreachable(self::A<core::num> a) → dynamic | 
 |   return block { | 
 |     core::int #t7; | 
 |     final synthesized self::A<core::num> #0#0 = a; | 
 |     #L3: | 
 |     { | 
 |       { | 
 |         hoisted (core::num) → void member; | 
 |         if(true) { | 
 |           member = self::_extension#1|get#member<core::num>(#0#0); | 
 |           #t7 = 1; | 
 |           break #L3; | 
 |         } | 
 |       } | 
 |       { | 
 |         hoisted (core::int) → void member; | 
 |         if(#0#0 is self::A<core::int>) { | 
 |           member = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); | 
 |           #t7 = 0; | 
 |           break #L3; | 
 |         } | 
 |       } | 
 |     } | 
 |   } =>#t7; | 
 | static method nonExhaustiveRestricted(self::A<core::num> a) → dynamic | 
 |   return block { | 
 |     core::int #t8; | 
 |     final synthesized self::A<core::num> #0#0 = a; | 
 |     synthesized (core::num) → void #0#1; | 
 |     synthesized core::bool #0#1#isSet = false; | 
 |     #L4: | 
 |     { | 
 |       { | 
 |         hoisted (core::num) → void member; | 
 |         if((#0#1#isSet ?{(core::num) → void} #0#1{(core::num) → void} : let final dynamic #t9 = #0#1#isSet = true in #0#1 = self::_extension#1|get#member<core::num>(#0#0)) is (core::num) → void) { | 
 |           member = #0#1#isSet ?{(core::num) → void} #0#1{(core::num) → void} : let final dynamic #t10 = #0#1#isSet = true in #0#1 = self::_extension#1|get#member<core::num>(#0#0); | 
 |           #t8 = 1; | 
 |           break #L4; | 
 |         } | 
 |       } | 
 |       { | 
 |         hoisted (core::int) → void member; | 
 |         if(#0#0 is self::A<core::int>) { | 
 |           member = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); | 
 |           #t8 = 0; | 
 |           break #L4; | 
 |         } | 
 |       } | 
 |     } | 
 |   } =>#t8; | 
 | static method intersection(dynamic o) → dynamic { | 
 |   #L5: | 
 |   { | 
 |     final synthesized dynamic #0#0 = o; | 
 |     synthesized (core::int) → void #0#2; | 
 |     synthesized core::bool #0#2#isSet = false; | 
 |     { | 
 |       lowered hoisted (core::int) → void member1#case#0; | 
 |       lowered hoisted (core::double) → void member2#case#0; | 
 |       lowered hoisted (core::int) → void member1#case#1; | 
 |       lowered hoisted (core::num) → void member2#case#1; | 
 |       if(#0#0 is self::A<core::int> && (let final dynamic #t11 = member1#case#0 = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final dynamic #t12 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}) in true) && (#0#0{self::A<core::int>} is self::A<core::double> && (let final dynamic #t13 = member2#case#0 = self::_extension#1|get#member<core::double>(#0#0{self::A<core::double>}) in true)) || #0#0 is self::A<core::int> && (let final dynamic #t14 = member1#case#1 = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final dynamic #t15 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}) in true) && (let final dynamic #t16 = member2#case#1 = self::_extension#1|get#member<core::num>(#0#0{self::A<core::int>}) in true)) { | 
 |       } | 
 |     } | 
 |   } | 
 | } | 
 | static method exhaustiveMixed(self::I<core::num> i) → core::num | 
 |   return block { | 
 |     core::num #t17; | 
 |     final synthesized self::I<core::num> #0#0 = i; | 
 |     synthesized core::num #0#1; | 
 |     synthesized core::bool #0#1#isSet = false; | 
 |     #L6: | 
 |     { | 
 |       { | 
 |         hoisted core::int member; | 
 |         if((#0#1#isSet ?{core::num} #0#1{core::num} : let final dynamic #t18 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) is core::int) { | 
 |           member = (#0#1#isSet ?{core::num} #0#1{core::num} : let final dynamic #t19 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) as{Unchecked} core::int; | 
 |           #t17 = member; | 
 |           break #L6; | 
 |         } | 
 |       } | 
 |       { | 
 |         hoisted core::double member; | 
 |         if(#0#0 is self::J<core::num> && (#0#1#isSet ?{core::num} #0#1{core::num} : let final dynamic #t20 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0{self::J<core::num>})) is core::double) { | 
 |           member = (#0#1#isSet ?{core::num} #0#1{core::num} : let final dynamic #t21 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0{self::J<core::num>})) as{Unchecked} core::double; | 
 |           #t17 = member; | 
 |           break #L6; | 
 |         } | 
 |       } | 
 |     } | 
 |   } =>#t17; | 
 |  | 
 | constants  { | 
 |   #C1 = TypeLiteralConstant(core::int) | 
 | } |